此代码有什么问题?怎么解决?父进程转到if或子进程?
第一个代码生成僵尸进程或第二个代码或两者或非?
#include <signal.h>
#include <sys/wait.h>
main() {
for (;;) {
if (!fork()) {
exit(0);
}
sleep(1);
}
}
这段代码怎么样:
#include <signal.h>
#include <sys/wait.h>
main() {
for (;;) {
if (fork()) {
exit(0);
}
sleep(1);
}
}
答案 0 :(得分:4)
因为代码不等待它的子代,并且它不会忽略SIGCHLD信号,所以该过程会累积僵尸 - 只有在父母等待它们时才会被清理的进程。
#include <stdlib.h>
#include <unistd.h>
int main(void)
{
for (;;)
{
if (fork() == 0)
exit(0);
sleep(1);
}
/* Unreached */
return(0);
}
替代代码成功地让父出口,而孩子进入休眠状态一秒钟,然后分叉并自杀(留下一个新的孩子继续这个过程)。
答案 1 :(得分:2)
我不知道问题是什么,因为我不知道你想要它做什么。它做的是分叉一个孩子,然后每秒退出(成功)。
当fork成功完成时,它会向子节点返回0,并将子节点的pid返回到父节点。因此,孩子在第一个程序中输入if主体,在第二个程序中输入父主。
第一个创建了无数个僵尸进程,因为父对象永远存在但永远不会等待。第二个不是因为父母立即退出,所以孩子是孤儿并被init采用。
编辑:解决更新问题。
答案 2 :(得分:1)
成功完成后,fork() 向子项返回值0 处理并返回进程ID 子进程到父进程 处理。否则,值为-1 返回父进程,没有 创建了子进程,并且 全局变量errno设置为indi- 提出错误。
该程序每秒创建子进程,立即退出。
换句话说,子进程“进入if”。您可以通过在if。
中添加printf
语句来进行检查
答案 3 :(得分:1)
从命令行输入
man 2 fork
它会告诉你你想知道的一切。
答案 4 :(得分:0)
返回值
成功完成后,fork()将向子进程返回0,并将子进程的进程ID返回给父进程。两个进程都将继续从fork()函数执行。否则,-1应返回到父进程,不应创建子进程,并设置errno以指示错误。
=================
if (!fork()) equals to if (0 == fork())
您的意思是什么,而不是在成功创建流程后创建流程?看起来像是一个问题...
答案 5 :(得分:0)
我可以建议您注释掉for循环并插入一些printf
语句(或使用gdb逐步执行)。这将让您深入了解正在发生的事情。或者用以下内容绑定for循环:
int i = 0;
for ( i = 0; i < 5; i++ )
而不是使用无限循环,以便更容易理解/调试。
同时阅读fork()
及其工作原理。那么你不仅能够回答这个问题,而且能够理解为什么这些答案适用,并且能够避免在你自己的软件中出错。
我建议保留睡眠声明。
我怀疑这个功课的重点是你通过修改它来了解它,并了解在你的系统上做什么和不安全。