免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1373 | 回复: 1
打印 上一主题 下一主题

[C] 求助关于管道和fork的问题,谢谢 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-10-25 11:01 |只看该作者 |倒序浏览
apue上的示例,只是做了小修改,现在是有两个兄弟进程之间进行管道通信, 现在的问题是 这里父进程怎么来回收这两个子进程呢, 现在结果可以出来,但是程序挂住, 难道是主进程阻塞? 还是子进程阻塞?

#include "../signal/myheader.h"

#define DEF_PAGER "/bin/more"
int main(int argc, char **argv)
{
        int n, fd[2];
        int status = -2;
        int status2 = -2;
        pid_t pid, pid2;
        char line[MAXLINE],  *argv0;
        char *pager = NULL;
        FILE *fp;
        FILE *fpp;

        if(argc != 2)
        {
                printf("usage: a.out <pathname> <pathname>\n");
                return 0;
        }

        if((fp = fopen(argv[1], "r")) == NULL)
                printf("error to fopen\n");
        if(pipe(fd) < 0)
                printf("error to pipe\n");

        if((pid = fork()) < 0)
                printf("error to fork()\n");
        else if(pid > 0)
        {
                if((pid2 = fork()) == 0)
                {
                printf("pid2 execing\n");
                close(fd[0]);
                while(fgets(line, MAXLINE, fp) != NULL)
                {
                        n = strlen(line);
                        if(write(fd[1], line, n) != n)
                                printf("error to write\n");
                }
                if(ferror(fp))
                        printf("error\n");
                close(fd[1]);
                 exit(0);
                }
                else if(pid2 > 0){
                if(waitpid(pid2 ,&status, 0) < 0)
                        printf("error to wait pid\n");
                printf("status = %d\n", status);
                if(waitpid(pid ,&status2, 0) < 0)
                        printf("error to wait pid2\n");
                printf("status2 = %d\n", status2);
                 exit(0);
                }
        }
        else
        {
                printf("pid execing\n");
                close(fd[1]);
                if(fd[0] != STDIN_FILENO)
                {
                        if(dup2(fd[0], STDIN_FILENO) != STDIN_FILENO)
                        {
                                printf("error to dup2\n");
                        }
                          close(fd[0]);
                }
                  if((pager = getenv("PAGER")) == NULL)
                    {
                    pager = DEF_PAGER;
                    printf("the pager is NULL\n");
                    }
                  printf("%s\n", pager);
                  if((argv0 = strrchr(pager, '/')) != NULL)
                     argv0++;
                  else
                    argv0 = pager;
                  if(execl(pager, argv0, (char *)0) < 0)
                        printf("error to execl\n");
                 exit(0);

        }

        return 0;
}

论坛徽章:
0
2 [报告]
发表于 2012-10-25 17:17 |只看该作者
先把代码格式化,把头文件也放出来。。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP