【问题标题】:My child process cannot receive the last value from parent process using Pipe我的子进程无法使用 Pipe 从父进程接收最后一个值
【发布时间】:2017-05-30 01:48:42
【问题描述】:

在我的程序中,子进程应该从键盘接收一些值,然后发送给父进程。父进程应计算总和并返回给子进程。我的程序如下所示:

3 4 5 -1 孩子(4753):发送 3 给父母 父母(4751):收到 3 父母(4751):送回 3 父母(4751):收到 4 父母(4751): 发回 7 父(4751):收到 5 个孩子(4753):收到 3 父母(4751):发回 12 父母(4753):收到 4 父母(4753): 发回 7 个父级(4753):收到 5 个父级(4753):发回 12 个

从结果来看,最后一步是 Parent 发回 12 但孩子无法收到 12 并显示总和。 因此,任何人都有一些想法为什么结果不是我的预期以及如何修改我的代码?

提前致谢。

【问题讨论】:

  • 代码没有使用main()函数的参数,所以main()签名应该是:int main( void )
  • 发布的代码没有完全编译,它缺少 wait() 函数的标题语句。 IE。 #include <sys/types.h> #include <sys/wait.h>,编译时,始终启用所有警告,修复这些警告。 (对于gcc,至少使用:-Wall -Wextra -pedantic 我也使用:-Wconversion -std=gnu99
  • 在调用任何scanf() 系列函数时,始终检查返回值(而不是参数值)以确保操作成功。
  • 这一行:while(buf[i]!= -1) 还应该检查输入缓冲区没有溢出(这将是未定义的行为,可能导致段错误事件)建议:while( i< 1024 && buf[i]!= -1)
  • while(buf[i] -1) 循环内,这一行:pid = getpid(); 覆盖了来自对fork() 的调用的信息,并且随后通过while() 循环将使用不正确的信息。

标签: c multithreading pipe fork


【解决方案1】:

您的父进程只是运行结束而不等待子进程完成。因此,孩子在实际打印结果之前就被杀死了。

您需要在父进程的适当位置添加wait()waitpid()

【讨论】:

  • 我添加了wait(NULL);在父进程结束时,close(fd[P2_WRITE]); ,但它显示相同的结果。你有什么想法吗?谢谢!
  • wait 实际上应该在closes 之前。当输入管道在完成之前关闭时,您的孩子可能会收到 SIGPIPE。
  • 我改变了 wait() 位置并禁止了 SIGPIPE。结果和以前一样。
  • 然后开始为你的返回值添加检查。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-22
  • 2017-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多