- 论坛徽章:
- 0
|
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;
}
|
|