两个进程进行通信的简单例子

add2.c 编译后生成执行文件add2

一个简单的加法运算器 通过标准输入端获取参数 标准输出端返回结果

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>

#define MAXLINE 1024
int main(int argc,char *argv[])
{
    int n,int1,int2;
    char line[MAXLINE];
    while((n = read(STDIN_FILENO,line,MAXLINE)) > 0)
    {
        line[n]=0;
        if(sscanf(line, "%d%d", &int1, &int2) == 2)
        {
            sprintf(line,"%d ",int1 + int2);
            n = strlen(line);
            if(write(STDOUT_FILENO,line,n) != n)
            {
                printf("write error ");
                exit(1);
            }    
            
        }
        else
        {
            if(write(STDOUT_FILENO,"invalid args ",13) != 13)
            {
                printf("write error ");
                exit(1);
            }
        }
    }    
    return 0;
}

add1.c 编译后生成执行文件add1

add1运行时将提示输入参数(123 456)获取参数后调用add2进行加法运算,获取结果并打印

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <signal.h>

#define MAXLINE 1024

static void sig_pipe(int);
int main(int argc,char *argv[])
{
    int n,fd1[2],fd2[2];
    pid_t pid;
    char line[MAXLINE];
    if(signal(SIGPIPE,sig_pipe) == SIG_ERR)
    {
        printf("signal error ");
        exit(1);
    }
    if(pipe(fd1) < 0 || pipe(fd2) < 0)
    {
        printf("pipe error ");
        exit(1);
    }
    if((pid = fork()) < 0)
    {
        printf("fork error ");
        exit(1);
    }
    else if(pid > 0)
    {
        close(fd1[0]);
        close(fd2[1]);
        while(fgets(line,MAXLINE,stdin) != NULL)
        {
            n = strlen(line);
            if(write(fd1[1],line,n) != n)
            {
                printf("write error to pipe ");
                exit(1);
            }
            if((n = read(fd2[0],line,MAXLINE)) < 0)
            {
                printf("read error from pipe ");
                exit(1);
            }
            if(n == 0)
            {
                printf("chile closed pipe ");
                break;
            }
            line[n]=0;
            if(fputs(line,stdout) == EOF)
            {
                printf("fputs error ");
                break;
            }
        }
        if(ferror(stdin))
        {
            printf("fgets  error on stdin ");
            exit(1);
        }
        exit(0);
    }
    else
    {
        close(fd1[1]);
        close(fd2[0]);
        if(fd1[0] != STDIN_FILENO)
        {
            if(dup2(fd1[0],STDIN_FILENO) != STDIN_FILENO)
            {
                printf("DUP2  error to stdin ");
                exit(1);
            }
            close(fd1[0]);    
        }
        if(fd2[1] != STDOUT_FILENO)
        {
            if(dup2(fd2[1],STDOUT_FILENO) != STDOUT_FILENO)
            {
                printf("DUP2  error to stdout ");
                exit(1);
            }
            close(fd2[1]);    
        }
        if(execl("./add2","add2",(char *)0) < 0)
        {
            printf("execl  error ");
            exit(1);
        }
    }
    return 0;
}
static void sig_pipe(int signo)
{    
    printf("SIGPIPE caught ");
    exit(1);
}

原文地址:https://www.cnblogs.com/xieweiwei/p/3254991.html