【问题标题】:Determining if a process is a child or parent process (not using return value of fork)判断一个进程是子进程还是父进程(不使用fork的返回值)
【发布时间】:2015-05-03 14:29:48
【问题描述】:

使用fork()后如何编写程序显示是子进程还是父进程?

我需要找到其他方法,然后检查 fork()getpid() 函数的返回值。

我知道例如进程资源利用率 (getrusage(2)) 和 CPU 时间计数器 (times(2)) 在子进程中重置为零。例如,我如何使用这些知识(或其他孩子与父母的差异)来确定我的问题?

感谢您的帮助!

【问题讨论】:

  • 为什么?使用fork的返回值有什么问题?
  • 我的练习是找到三种方法来确定进程是子进程还是父进程。我已经使用了forkgetpid 的返回值。现在我需要找到第三种解决方案。
  • 获取fork之前和之后的进程ID。比较
  • 我已经完成了。这是我的第二个解决方案。
  • 改用getppid

标签: c linux fork


【解决方案1】:
  • 在其中一个进程中为SIGCHLD 设置信号处理程序并结束另一个进程。如果SIGCHLD 处理程序被调用,您就知道孩子死了。如果不是父母死了。

  • 调用wait() 的另一种(破坏性较小)方式。如果它返回ECHLD 周围没有孩子,那么调用进程就是孩子。如果它阻塞,则至少有一个孩子在身边,因此调用进程是父进程。

  • 或者用其他进程的PID调用waitpid()。与wait() 的结果逻辑相同。

【讨论】:

    【解决方案2】:

    您可以利用这样一个事实,即父进程将是进程组领导(因此其 pid 将与其进程组 ID 相同),而子进程将是该进程组的成员,因此其 pid 将不同来自进程组 id:

    #include <stdio.h>
    #include <unistd.h>
    
    main(int argc, char **argv) {
        char *self = NULL;
    
        fork(); /* looking at return value would be cheating */
        int pid = getpid();
        int pgid = getpgid(0);
    
        if (pid == pgid)
            self = "Parent";
        else
            self = "Child";
    
        printf("%s pid = %d pgid = %d\n", self, pid, pgid);
    }
    

    运行产量:

    $ ./pgid
    Parent pid = 29400 pgid = 29400
    Child pid = 29401 pgid = 29400
    

    这当然仍然使用getpid(),但与您上面描述的方式不同。

    【讨论】:

      【解决方案3】:

      在 Linux 上,您还可以使用 proc(5)。 pid 1234 的过程由目录/proc/1234/ 描述,您可以顺序读取并解析/proc/1234/status 伪文件以获取所有信息。

      要了解更多信息,请阅读 proc(5) 手册页,然后键入

       cat /proc/self/status
       cat /proc/$$/status
       cat /proc/self/maps
       cat /proc/$$/maps
      

      在终端中,并尝试理解输出。您可能会以编程方式解析它(例如,使用 FILE*f = fopen("/proc/1234/status","r"); 然后在 f 上执行一些 fgetsfscanf;然后 fclose(f);

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-12-06
        • 1970-01-01
        • 2015-08-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-02-09
        • 1970-01-01
        相关资源
        最近更新 更多