【问题标题】:Getting the id of a Parent Process from its child in C从 C 中的子进程获取父进程的 id
【发布时间】:2016-01-20 17:35:18
【问题描述】:

我是一名计算机科学专业的学生,​​我目前正在学习操作系统课程,该课程要求我们使用 C 我试图解决的一个问题是:

编写一个 fork 一个孩子的程序。

孩子应该睡 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;



}

【问题讨论】:

  • getppid 在孩子中?
  • 在调用 fork() 之前调用 getpid(),你会得到它放在一个银盘上。
  • @HansPassant 那太好了.. :)

标签: c process operating-system fork


【解决方案1】:

正如哈里斯在他的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

【讨论】:

    【解决方案2】:

    你可以使用函数getppid()

    getppid() 返回调用进程的父进程ID。

    【讨论】:

    • 我试过了,哈哈,这可能看起来很有趣,但是我的程序杀死了我的操作系统,我的 linux 机器关闭了
    • 有点难以相信你能杀死它。但如果发生这种情况是因为父 pid 为 1(linux 中的 init 进程)。你确定你是在子进程中做的吗?
    • @CaptainZi 发生这种情况是因为您的父进程甚至在您调用 kill 之前就已完成。如果您无法弄清楚,我会在某个时候发布详细的答案。
    • 所以我想我应该在父进程中等待
    猜你喜欢
    • 2017-05-23
    • 2011-07-16
    • 1970-01-01
    • 1970-01-01
    • 2013-07-18
    • 2021-04-13
    • 2013-08-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多