我在以下方面遇到了一些困难:
我试图将一个管道发送到一个函数中的子节点,然后让孩子写入它。
以下代码部分将更好地解释:
int p[2];
int i;
pipe(p);
close(p[1]);
if(fork1() == 0){
close(p[0]);
runcmd(parsecmd(buf),p);
}
wait(0);
}
while(read(p[0],&i,sizeof(int)) != 0){
printf(1," id: %d\n",i );}
和runcmd将具有以下代码:
...
void runcmd(struct cmd *cmd,int pp[]){
int j = getpid();
write(pp[1],&j,sizeof(int));
close(pp[1]);
...
遗憾的是,预期的结果应该是 - 父节点将打印id(getpid是一个返回当前正在运行的进程ID的函数),但它没有,它在唤起时不打印任何内容。我做错了什么?
答案 0 :(得分:1)
在分叉之前关闭管道的写入侧,以便子进程无法写入。你还需要exit()
孩子。所以你的代码应该是......那样:
pipe(p);
if(fork1() == 0){
close(p[0]);
runcmd(parsecmd(buf),p);
exit(0);
}
close(p[1]);
...
此外我建议添加一些错误处理(fork()
也可以返回-1)`
编辑:这适用于Linux
void runcmd(int pp[])
{
int j = getpid();
write(pp[1],&j,sizeof(int));
close(pp[1]);
exit(0);
}
int main( int argc, char *argv[] )
{
int p[2];
int i;
int status;
pipe(p);
if(fork() == 0){ // for linux: fork() instead of fork1()
close(p[0]);
runcmd(p);
}
close(p[1]); // close belongs here
wait(&status); // Linux: wait(0) is not allowed
while(read(p[0],&i,sizeof(int)) > 0) // != 0 causes endless loopn on EOF
{
printf(" id: %d\n",i ); // first parameter '1' doesn't belong there
}
return( 0 );
}
答案 1 :(得分:0)