在C中为父子IPC使用管道生成程序块

在C中为父子IPC使用管道生成程序块,c,pipe,ipc,interprocess,C,Pipe,Ipc,Interprocess,我正在编写一个服务器,当它接受套接字连接时,fork()关闭子进程 当孩子与客户端通信时,它必须将部分信息发送回父母。我用一根管子来完成这个 问题是,当我尝试执行父子IPC时,父进程在读取子进程的输入时会阻塞。这意味着,即使子级同时运行,它们也只能一次处理一次,因为它们都在等待父级 我的代码如下所示(为简洁起见,已删除错误检查): 所以我的问题是,我该如何补救?我如何让家长使用管道与孩子们进行通信,使其不会阻塞 这在管道中是可能的,还是应该使用共享内存(我猜是信号量)或消息队列?(我读了这篇文章

我正在编写一个服务器,当它接受套接字连接时,fork()关闭子进程

当孩子与客户端通信时,它必须将部分信息发送回父母。我用一根管子来完成这个

问题是,当我尝试执行父子IPC时,父进程在读取子进程的输入时会阻塞。这意味着,即使子级同时运行,它们也只能一次处理一次,因为它们都在等待父级

我的代码如下所示(为简洁起见,已删除错误检查):

所以我的问题是,我该如何补救?我如何让家长使用管道与孩子们进行通信,使其不会阻塞

这在管道中是可能的,还是应该使用共享内存(我猜是信号量)或消息队列?(我读了这篇文章:但很难找到这些任务是如何实际完成的。)

更多详情:

我有一个测试程序,可执行以下操作: 1.连接到服务器 2.睡眠(5) 3.断开与服务器的连接

当我运行此程序的2个实例时,服务器输出以下内容:

connected!
  // pause for 5 seconds
disconnected!
connected!
  // pause for 5 seconds
disconnected!
显然,一次只处理一个客户机

当我删除IPC时-当我从父级和子级中删除管道read()和write()时,我得到以下结果:

connected!
connected!
  // pause for 5ish seconds
disconnected!
disconnected!
这就是我想要的

有没有想过我该如何做到这一点?(或者我应该改变解决这个问题的方式?)


(编辑:这是一个网络类作业的一部分。我们正在实施一个P2P协议,它使用一个集中的服务器来管理对等点。我们可以使用任何语言,我想我会在C中尝试一下。)

我在下面写下了答案,在重新阅读你的问题时,注意到我完全错过了你的实际问题。然而,它在任何情况下都可能是有用的信息

要回答您同时遇到的家长问题,您需要让家长设置一个
select()
循环,以便随时处理来自其任何孩子的可能响应。您需要:

  • 记录有多少儿童开放
  • 为每个孩子准备一套管道
  • 使用带有
    select()
    的循环既可以接受传入连接(因为它们可能随时发生),也可以接受来自任何子节点的传入数据
  • 使用
    waitpid()
    获取已终止的子项
这项技术功能强大,但需要大量簿记才能正确设置


默认情况下,在父进程中打开的文件句柄在子进程中继承。问题可能是父级和子级都有管道的写入端仍然打开,因此当父级从管道读取时,它将永远看不到管道的结束。在开始从
write\u-to\u-parent[0]
读取之前,尝试在父对象中使用
close(write\u-to\u-parent[1])
。因此:

} else { /* parent */
     close(write_to_parent[1]);
     while (read(write_to_parent[0], &buf, 1024) > 0) {
         /* accept data from child process, and do some processing */
     }
}

关于使用close(),您是对的-我在代码中有这一点,但我在这段代码中无意中省略了它。不过,我又加了回去。非常感谢。
} else { /* parent */
     close(write_to_parent[1]);
     while (read(write_to_parent[0], &buf, 1024) > 0) {
         /* accept data from child process, and do some processing */
     }
}