【问题标题】:Why do popen() and fork()+execl() yield different results for `cat /proc/$PPID/comm`?为什么 popen() 和 fork()+execl() 对 `cat /proc/$PPID/comm` 产生不同的结果?
【发布时间】:2022-07-13 00:05:00
【问题描述】:

我想了解为什么以下 sn-ps 行为不同,以及如何使它们行为相同。

1。弹出()

这给了我调用进程的名称,比如“myprog”。

popen("cat /proc/$PPID/comm", "r");

2。 fork() + execl()

这给了我“sh”。

    if (fork() == 0) {
        close(fd[0]);
        dup2(fd[1], STDOUT_FILENO);
        close(fd[1]);

        execl("/bin/sh", "sh", "-c", "cat /proc/$PPID/comm", (char*)NULL);
        exit(EXIT_SUCCESS);
    }

我的主要问题是如何让 fork()+execl() 也返回“myprog”?

【问题讨论】:

    标签: c process fork popen


    【解决方案1】:

    您需要等待子进程完成。如果没有,父进程可能会在子 shell 运行之前退出。孤儿将由initsystemd 继承,$PPID 将引用此内容(我不确定您为什么得到sh 而不是其中之一)。

    #include <unistd.h>
    #include <stdlib.h>
    #include <wait.h>
    
    int main(void) {
        if (fork() == 0) {
            execl("/bin/sh", "sh", "-c", "pstree", (char*)NULL);
        } else {
            wait(NULL);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2021-07-24
      • 2016-06-29
      • 1970-01-01
      • 1970-01-01
      • 2017-08-08
      • 2019-08-12
      • 2021-09-09
      • 2017-02-21
      • 2014-10-18
      相关资源
      最近更新 更多