在 c 套接字中使用带有 select() 的 fork() 的目的
Purpose of using fork() with select() in c sockets
我去年做了一个项目,(重新创建一个像 tcsh 这样的小终端)我使用了 fork()
因为 execve()
杀死了实际的进程,所以我使用了 fork()
执行 child 中的 execve()
和 parent 等待其死亡。
这里一切都清楚了,现在我正在使用 C 中的套接字,项目要求我使用 select()
来处理 fd 并使用 fork()
来处理。所以,我的无限循环里面有 select()
和 fork()
,我知道我们必须使用 fork()
以获得更好的性能和速度。但是我看到如果我在 parent 过程中不使用 waitpid()
或类似的东西, child 就会变成僵尸。
问题是,有什么办法可以不用等child?
在 parent 执行其他任务时扫描 child 进程的最佳方法是什么?
我的意思是,如果在这种情况下我必须等待 child,我不会提高速度。
还有另外一个问题,变成僵尸的child会消耗资源吗?有僵尸 child 是个问题吗?
fork()
产生一个子进程;网络编程不需要它,但一些网络程序这样做是为了允许处理特定客户端的代码与接受传入 TCP 连接的代码(在 parent-process 中)并行执行。其他方法包括产生一个线程来处理客户端,或使用异步 I/O,或使用 select()
和 non-blocking I/O 在 same/single 线程中处理客户端.
如果您调用 fork()
并且不希望您的子进程变成僵尸,您将需要在某个时候对子进程调用 waitpid()
;否则子进程的 return-value 将保持未收集状态,您将拥有一个僵尸进程。但是,您不必立即致电 waitpid()
;如果你传入 WNOHANG
参数,你可以避免 waitpid()
阻塞;相反,如果子进程仍然存在,WNOHANG
waitpid()
将立即 return 0
,您可以稍后再尝试调用它。
拥有僵尸进程是个问题,因为如果你继续生成它们,最终 processes-table 会充满僵尸,然后你将无法产生更多进程。
我去年做了一个项目,(重新创建一个像 tcsh 这样的小终端)我使用了 fork()
因为 execve()
杀死了实际的进程,所以我使用了 fork()
执行 child 中的 execve()
和 parent 等待其死亡。
这里一切都清楚了,现在我正在使用 C 中的套接字,项目要求我使用 select()
来处理 fd 并使用 fork()
来处理。所以,我的无限循环里面有 select()
和 fork()
,我知道我们必须使用 fork()
以获得更好的性能和速度。但是我看到如果我在 parent 过程中不使用 waitpid()
或类似的东西, child 就会变成僵尸。
问题是,有什么办法可以不用等child? 在 parent 执行其他任务时扫描 child 进程的最佳方法是什么? 我的意思是,如果在这种情况下我必须等待 child,我不会提高速度。
还有另外一个问题,变成僵尸的child会消耗资源吗?有僵尸 child 是个问题吗?
fork()
产生一个子进程;网络编程不需要它,但一些网络程序这样做是为了允许处理特定客户端的代码与接受传入 TCP 连接的代码(在 parent-process 中)并行执行。其他方法包括产生一个线程来处理客户端,或使用异步 I/O,或使用 select()
和 non-blocking I/O 在 same/single 线程中处理客户端.
如果您调用 fork()
并且不希望您的子进程变成僵尸,您将需要在某个时候对子进程调用 waitpid()
;否则子进程的 return-value 将保持未收集状态,您将拥有一个僵尸进程。但是,您不必立即致电 waitpid()
;如果你传入 WNOHANG
参数,你可以避免 waitpid()
阻塞;相反,如果子进程仍然存在,WNOHANG
waitpid()
将立即 return 0
,您可以稍后再尝试调用它。
拥有僵尸进程是个问题,因为如果你继续生成它们,最终 processes-table 会充满僵尸,然后你将无法产生更多进程。