- 论坛徽章:
- 0
|
回复 6# timespace
不好意思啊,我还有一个问题,两个进程成功了,但三个时有问题了,不是setpgid的问题,应该是管道的问题。我实现 ls|more|wc ,我创建的顺序是wc,more和ls,程序没有结果而且总是不结束,请帮忙看一下原因,麻烦您了。
- /*
- * ls | more | wc,使这三个在一个进程组
- */
- #include <stdio.h>
- #include <unistd.h>
- #include <sys/wait.h>
- pid_t pgid;
- int main()
- {
- pid_t pids[10];
- int pipes[10][2];
- char *ls[] = {"ls", NULL};
- char *more[] = {"more", NULL};
- char *wc[] = {"wc", NULL};
- int i;
- printf("comm: main, pid: %d, pgid: %d\n", getpid(), getpgid(0));
- /*
- * wc
- */
- for(i = 0; i < 10; i++){
- if(pipe(pipes[i]) == -1){
- printf("pipe error\n");
- }
- }
- if((pids[2] = fork()) == -1){
- perror("fork error");
- } else if(pids[2] == 0){
- //输入
- close(pipes[1][1]);
- dup2(pipes[1][0], STDIN_FILENO);
- close(pipes[1][0]);
- if(setpgid(0, 0) == -1){
- printf("in child, %s setpgid error\n", wc[0]);
- }
- pgid = getpgid(0);
- if(execvp(wc[0], wc) == -1){
- printf("exec %s failed\n", ls[0]);
- }
- } else if(pids[2] > 0){
- pgid = pids[2];
- if(setpgid(pids[2],pids[2]) == -1){
- printf("in parent, %s setpgid error\n", wc[0]);
- }
- printf("comm: %s, pid: %d, pgid: %d\n", wc[0], pids[2], getpgid(pids[2]));
- }
- /*
- * more
- */
- if((pids[1] = fork()) == -1){
- perror("fork error");
- } else if(pids[1] == 0){
- //输入
- close(pipes[0][1]);
- dup2(pipes[0][0], STDIN_FILENO);
- close(pipes[0][0]);
- //输出
- close(pipes[1][0]);
- dup2(pipes[1][1], STDOUT_FILENO);
- close(pipes[1][1]);
- if(setpgid(0, pgid) == -1){
- printf("in child, %s setpgid error\n", more[0]);
- }
- if(execvp(more[0], more) == -1){
- printf("exec %s failed\n", more[0]);
- }
- } else if(pids[1] > 0){
- if(setpgid(pids[1], pgid) == -1){
- printf("in parent, %s setpgid error\n", more[0]);
- }
- printf("comm: %s, pid: %d, pgid: %d\n", more[0], pids[1], getpgid(pids[1]));
- }
- /*
- * ls
- */
- if((pids[0] = fork()) == -1){
- perror("fork error");
- } else if(pids[0] == 0){
- //输出
- close(pipes[0][0]);
- dup2(pipes[0][1], STDOUT_FILENO);
- close(pipes[0][1]);
- if(setpgid(0, pgid) == -1){
- printf("in child, %s setpgid error\n", ls[0]);
- }
- if(execvp(ls[0], ls) == -1){
- printf("exec %s failed\n", ls[0]);
- }
- } else if(pids[0] > 0){
- if(setpgid(pids[0], pgid) == -1){
- printf("in parent, %s setpgid error\n", ls[0]);
- }
- printf("comm: %s: pid: %d, pgid: %d\n", ls[0], pids[0], getpgid(pids[0]));
- waitpid(pids[0], NULL, 0);
- }
- waitpid(pids[1], NULL, 0);
- close(pipes[0][0]);
- close(pipes[0][1]);
- waitpid(pids[2], NULL, 0);
- close(pipes[1][0]);
- close(pipes[1][1]);
- return 0;
- }
复制代码 |
|