从C中的子进程获取父进程的id

时间:2015-10-21 16:04:46

标签: c process operating-system fork

我是一名计算机科学专业的学生,​​我正在学习一门操作系统课程,要求我们与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;



}

2 个答案:

答案 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。