在C中为父子IPC使用管道生成程序块
我正在编写一个服务器,当它接受套接字连接时,fork()关闭子进程 当孩子与客户端通信时,它必须将部分信息发送回父母。我用一根管子来完成这个 问题是,当我尝试执行父子IPC时,父进程在读取子进程的输入时会阻塞。这意味着,即使子级同时运行,它们也只能一次处理一次,因为它们都在等待父级 我的代码如下所示(为简洁起见,已删除错误检查): 所以我的问题是,我该如何补救?我如何让家长使用管道与孩子们进行通信,使其不会阻塞 这在管道中是可能的,还是应该使用共享内存(我猜是信号量)或消息队列?(我读了这篇文章:但很难找到这些任务是如何实际完成的。) 更多详情: 我有一个测试程序,可执行以下操作: 1.连接到服务器 2.睡眠(5) 3.断开与服务器的连接 当我运行此程序的2个实例时,服务器输出以下内容:在C中为父子IPC使用管道生成程序块,c,pipe,ipc,interprocess,C,Pipe,Ipc,Interprocess,我正在编写一个服务器,当它接受套接字连接时,fork()关闭子进程 当孩子与客户端通信时,它必须将部分信息发送回父母。我用一根管子来完成这个 问题是,当我尝试执行父子IPC时,父进程在读取子进程的输入时会阻塞。这意味着,即使子级同时运行,它们也只能一次处理一次,因为它们都在等待父级 我的代码如下所示(为简洁起见,已删除错误检查): 所以我的问题是,我该如何补救?我如何让家长使用管道与孩子们进行通信,使其不会阻塞 这在管道中是可能的,还是应该使用共享内存(我猜是信号量)或消息队列?(我读了这篇文章
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 */
}
}