我是一名计算机科学专业的学生,我正在学习一门操作系统课程,要求我们与C合作 我想解决的一个问题如下:
编写一个分发儿童的程序。
孩子应该睡5秒钟。
孩子应该打印“我准备谋杀我的父母了!”
孩子应该通过信号杀死它的父母(使用kill(parent_id,SIGINT))。
孩子应该打印“我现在是一个孤儿”。
父母应该等待孩子并打印“我是父母”。
我试图使用以下代码解决它,但我无法找到一种方法来获取父母的id。非常感谢,感谢提前:)
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <signal.h>
int main ()
{
pid_t pid =fork();
if (pid<0)
{
printf("%s\n","Error in forking");
}
else if (pid==0)//child
{
sleep(5);
printf("%s","I am ready to murder my parent!");
kill(//parent id here,SIGINT);
printf("%s","I am an orphan now");
}
else{ // parent
printf("%s\n","I am the parent");
}
return 0;
}
答案 0 :(得分:3)
正如Haris在answer中提到的那样,您应该使用getppid()来获取父母的pid
。
回复您的评论here,
好吧,我试过了,大声笑,这可能看起来很有趣,但我的程序杀了我的操作系统,我的linux机器倒了
让我们来看看你的代码,
else if (pid==0){ //child
sleep(5);
printf("%s","I am ready to murder my parent!");
kill(//parent id here,SIGINT);
printf("%s","I am an orphan now");
}
else{ // parent
printf("%s\n","I am the parent");
}
父进程在执行完printf("%s\n","I am the parent");
后会做什么?它终止了。
那么,谁是原始父母已终止的进程的父级?子进程变成孤儿。引自Wikipedia
孤立进程是一个计算机进程,其父进程已完成或终止,但它仍然在运行。在类Unix操作系统中,任何孤立的进程都将立即被特殊的init系统进程采用。
因此,当您调用kill()
时,您正在init
进程中执行此操作。这就是lol that might seems funny , but my program killed my os , my linux machine shuted down
请查看this answer。
答案 1 :(得分:2)
您可以使用getppid()
getppid()返回调用进程父进程的进程ID。