协同进程问题求助

发布于 2022-08-24 18:57:52 字数 6084 浏览 5 评论 1

<code>
/***********************************************************************************/
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <signal.h>
#include <fcntl.h>

#define MAX_LINE        2048

static void sig_pipe(int);

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

    if(signal(SIGPIPE, sig_pipe) == SIG_ERR)
    {
        printf("init signal error: %sn", strerror(errno));
        exit(1);
    }

    if((pipe(fd1) < 0) || (pipe(fd2) < 0))
    {
        printf("create pipe error: %sn", strerror(errno));
        exit(1);
    }

    if ((pid = fork()) < 0)
    {
        printf("fork error: %sn", strerror(errno));
        exit(1);
}
else if (pid > 0)
{
   close(fd1[0]);
   close(fd2[1]);
   while (fgets(line, MAX_LINE, stdin) != NULL)
   {
    n = strlen(line);
    if (write(fd1[1], line, n) != n)
    {
     printf("write to pipe failed: %sn", strerror(errno));
     exit(1);
    }
   
    if ((n = read(fd2[0], line, MAX_LINE)) < 0)
    {
     printf("read from pipe failed: %sn", strerror(errno));
     exit(1);
    }
   
    if (n == 0)
    {
     printf("child closed pipen");
     break;
    }
   
    line[n] = 0;
    if (fputs(line, stdout) == EOF)
    {
     printf("fputs error: %sn", strerror(errno));
     exit(1);
    }
   }
   if (ferror(stdin))
   {
    printf("fgets error: %sn", strerror(errno));
    exit(1);
   }
    }
    else
    {
   close(fd1[1]);
   close(fd2[0]);
  
   if (fd1[0] != STDIN_FILENO)
   {
    if (dup2(fd1[0], STDIN_FILENO) != STDIN_FILENO)
    {
     printf("dup2 error: %sn", strerror(errno));
     exit(1);
    }
    close(fd1[0]);
   }
  
   if (fd2[1] != STDOUT_FILENO)
   {
    if (dup2(fd2[1], STDOUT_FILENO) != STDOUT_FILENO)
    {
     printf("dup2 error: %sn", strerror(errno));
     exit(1);
    }
    close(fd2[1]);
   }
  
   if (execl("./add2", "add2", (char *)0) < 0)
   {
    printf("execl error: %sn", strerror(errno));
    exit(1);
   }
}
exit(0);
}

static void
sig_pipe(int signo)
{
printf("SIG_PIPE caughtn");
exit(1);
}
/***********************************************************************************/
</code>

过滤程序:
<code>
/***********************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>

#define   MAX_LINE   2048

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

while ((n = read(STDIN_FILENO, line, MAX_LINE)) > 0)
{
   if (sscanf(line, "%d%d", &int1, &int2) == 2)
   {
    sprintf(line, "%dn", int1 + int2);
    n = strlen(line);
    if (write(STDOUT_FILENO, line, n) != n) {
     printf("write error: %s", strerror(errno));
     exit(1);
    }
   }
   else
   {
    if(write(STDOUT_FILENO, "Invalid argsn", 13) != 13)
    {
     printf("write error: %s", strerror(errno));
     exit(1);
    }
   }
}
exit(0);
}
/***********************************************************************************/
</code>

我是在linux环境上编译的,父进程可以将读取到的数据传给子进程,子进程能够处理也能够将结果写回管道,问题出现在父进程读取返回结果时,读到的内容长度为0,
    if (n == 0)
    {
          printf("child closed pipen");
          break;
    }
就在这个地方程序退出了。求各位大哥帮忙。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

悲念泪 2022-08-26 12:05:04

哈哈,自己搞定了

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文