gpt4 book ai didi

c - 在函数内的父级和子级之间传输管道

转载 作者:行者123 更新时间:2023-11-30 15:22:13 26 4
gpt4 key购买 nike

我在以下事情上遇到了一些困难:
我试图将管道发送到函数内的子节点,然后让子节点写入其中。
以下代码部分将更好地解释它:

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 的函数),但事实并非如此,它在调用时不打印任何内容。我做错了什么?

最佳答案

在 fork 之前关闭管道的写入端,这样子进程就无法写入它。您还需要 exit() child 。所以你的代码应该是……像这样:

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 );
}

关于c - 在函数内的父级和子级之间传输管道,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29277090/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com