您当前的位置: 首页 > 

暂无认证

  • 1浏览

    0关注

    92582博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

APUE编程:124---进程间通信(协同进程)

发布时间:2019-04-23 13:07:12 ,浏览量:1

一、概念

二、演示案例1

此add2程序作为下面演示案例2的协同进程

#include
#include
#include 
#include 
#define MAXLINE 1024

int main()
{
    int n, int1, int2;
    char line[MAXLINE];

    while ((n = read(STDIN_FILENO, line, MAXLINE)) > 0) {
        line[n] = 0; /* null terminate */
        if (sscanf(line, "%d%d", &int1, &int2) == 2) {
            sprintf(line, "%d\n", int1 + int2);
            n=strlen(line);
            if (write(STDOUT_FILENO, line, n) != n)
                perror("write error");
        } else {
            if (write(STDOUT_FILENO, "invalid args\n", 13) != 13)
                perror("write error");
        }
    }
    exit(0);
}

三、演示案例2

#include
#include
#include 
#include 
#define MAXLINE 1024

#define MAXLINE 1024
static void sig_pipe(int); /* our signal handler */

int main()
{
    int n, fd1[2], fd2[2];
    pid_t pid;
    char line[MAXLINE];

    if (signal(SIGPIPE, sig_pipe) == SIG_ERR)
        perror("signal error");
  
    if (pipe(fd1) < 0 || pipe(fd2) < 0)
        perror("pipe error");

    if ((pid = fork()) < 0) {
        perror("fork error");
    } 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)
                perror("write error to pipe");
            if ((n = read(fd2[0], line, MAXLINE)) < 0)
                perror("read error from pipe");
            if (n == 0) {
                printf("child closed pipe\n");
                break;
            }
            line[n] = 0; /* null terminate */
            if (fputs(line, stdout) == EOF)
                perror("fputs error");
        }

        if (ferror(stdin))
            perror("fgets error on stdin");
        exit(0);
    } else {   //子进程
        close(fd1[1]);
        close(fd2[0]);
        if (fd1[0] != STDIN_FILENO) {
            if (dup2(fd1[0], STDIN_FILENO) != STDIN_FILENO)
                perror("dup2 error to stdin");
            close(fd1[0]);
        }

        if (fd2[1] != STDOUT_FILENO) {
            if (dup2(fd2[1], STDOUT_FILENO) != STDOUT_FILENO)
                perror("dup2 error to stdout");
            close(fd2[1]);
        }
        if (execl("./add2", "add2", (char *)0) < 0)
            perror("execl error");
    }
    exit(0);
}

static void sig_pipe(int signo)
{
    printf("SIGPIPE caught\n");
    exit(1);
}

四、缓冲机制的注意事项

#include
#include
int main()
{
    int int1, int2;
    char line[MAXLINE];

    while (fgets(line, MAXLINE, stdin) != NULL) {
        if (sscanf(line, "%d%d", &int1, &int2) == 2) {
            if (printf("%d\n", int1 + int2) == EOF)
                perror("printf error");
        } else {
            if (printf("invalid args\n") == EOF)
                perror("printf error");
        }
    }
    exit(0);
}

关注
打赏
1653961664
查看更多评论
立即登录/注册

微信扫码登录

0.0754s