当我意识到我的程序没有退出时,我正在系统编程中练习管道。我在孩子和父母都添加了exit()
,但孩子仍然没有退出。请帮忙...
这是代码:
#include<stdlib.h>
#include<stdio.h>
#include<unistd.h>
//#include "apue.h"
main() {
int n,max=20;
pid_t pid;
int fd[2];
char line[max];
int i;
for(i=0;i<20;i++) {
line[i]='\0';
}
if(pipe(fd)<0) {
perror("pipe error");
}
if((pid=fork())<0) {
perror("fork error");
}
else if(pid > 0) {
close(fd[0]);
write(fd[1], "hello world\n", 12);
exit(1);
} else {
close(fd[1]);
read(fd[0], line, max);
}
puts(line);
exit(1);
}
答案 0 :(得分:2)
首先,fork不会在parrent中返回0。所以,当你写
否则if(pid&gt; 0){
close(fd[0]); write(fd[1], "hello world\n", 12); exit(1); }
你正处在同一个过程中。要进入子进程空间,您应该使用else if(pid **==** 0)
你应该做的第二件事是确保一切正常,你不应该在子进程代码空间中调用函数exit()
。您最好在parrent过程中等待您的子进程。为此,您应该在parrent过程中使用wait()
函数。
好的代码是:
main() {
int n,max=20;
pid_t pid;
int fd[2];
char line[max];
int i;
int status;
for(i=0;i<20;i++) {
line[i]='\0';
}
if(pipe(fd)<0) {
perror("pipe error");
}
pid=fork();
if(pid <0) {
perror("fork error");
}
else if(pid == 0) { // Here is the child process
close(fd[0]);
write(fd[1], "hello world\n", 12);
**// Do not kill child process because is dangeorus to do this when you use pipes**
} else { // Parrent process
close(fd[1]);
read(fd[0], line, max);
puts(line);
wait(&status); // Wait the child process to end its job
}
return 0;
}