我是C的新手,过去两周我一直在研究叉子,我必须为我的操作系统课程解决这个问题:
“你必须使用fork创建一个”重量级“进程,然后第一个进程必须等待第二个进程(新的进程)返回其父id,然后它必须终止其父进程并完成”
我觉得这些说明很混乱,这是我的代码到目前为止(正如我所说的,我是C的新手,所以我一直在调查) 我的问题似乎是父亲甚至没有等待子进程返回它的id,因为在那之后,孩子正在杀死父进程,所以我认为我正在创建子进程,当它运行时它会杀死它最后是父级,不让父级等待子级执行。 (这是我认为令人困惑的部分说明) 我想更多地了解分支和进程,比如它们背后的逻辑,这样我在编码时就会更加确定。 谢谢!
#include <sys/types.h>
#include <wait.h>
#include <unistd.h>
#include <stdio.h>
int main() {
pid_t idProceso;
int childState;
idProceso = fork();
if (idProceso == 0){
printf ("child id : %d. parent id %d\n",
getpid(), getppid());
int parent = getppid();
kill(parent, SIGKILL);
printf ("dead parent"); // not sure about it ??
_exit();
}
if(idProceso > 0){
sleep (1);
printf ("parent id : %d. child id %d\n",
getpid(), idProceso);
wait (&childState);
}
return 0;
}
答案 0 :(得分:1)
根据您给出的分配说明,我认为分配它的教师或教授对Unix机器上的英语语言或进程概念没有很好的处理。
您提出的解决方案是合理的,但我会删除睡眠呼叫。从来没有将Childstate设置正确,并且您不需要它。此外,不要将SIGKILL发送给父母。 SIGKILL是尝试终止进程的最后一种方式。我建议将SIGTERM发送到父进程。如果您使用的是Linux机器,则父进程可以使用sigaction安装信号处理程序。在信号处理程序中,您可以打印一条很好的消息,例如“从子节点接收终止信号”并调用exit。如果你这样做,你的教授可能会对你的技能印象深刻,给你一个及格分数。
如果做不到,我会要求更好的问题。在实际解决问题之前,我必须向教授提交语法和标点修正以供批准,这种情况并不少见。
答案 1 :(得分:1)
我的问题似乎是父母甚至没有等待 子进程返回其id
您的程序中没有任何地方将子ID返回给父级。唯一正在发生的通信是孩子向父母发送SIGKILL信号。
所以我认为我正在创建子进程,当它运行时就会杀死它 父母最后,不让父母等待孩子 执行。
是的,你是对的,孩子会通过使用kill()函数发送一个SIGKILL信号来杀死父进程,但是父进程实际上等待被孩子杀死。
wait (&childState);
这使得父母等待(挂在那里)让孩子终止,在终止后,父母会继续前进,但在你的程序中,当父母等待孩子终止时,孩子本身将终止父母在等待期间。
我想了解更多关于叉子和流程的信息,比如背后的逻辑 它们让我在编码时更加确定。
something值得关注。
答案 2 :(得分:0)
$ ./foo.bin
parent id : 6629. child id 6630
child id : 6630. parent id 6629
dead parentKilled
我刚删除了sleep(1)
,输出似乎合理。