在Linux中创建独立的过程

Create independent process in Linux

本文关键字:过程 独立 创建 Linux      更新时间:2023-10-16

我希望实现类似于CreateProcess但在Linux上的函数。我做了很多研究,发现了使用双叉在init下运行孩子的"叉子脱落和死亡"方法。也就是说,允许孩子独立于父母操作。

因为父母需要返回有关新创建的子进程(即pid,name等)的信息,所以我需要知道我是否遇到了代码中的竞赛条件。目前,我叉并检索第二个叉子的PID通过管道,然后等待第一个叉子退出。

int child = 0;
int fd[2] = { 0, 0 };
if (pipe (fd) != 0)
    return Process();
int pid = fork();
if (pid < 0)
    return Process();
if (pid == 0) // Child
{
    if (setsid() != -1)
    {
        child = fork();
        if (child == 0)
        {
            umask (0); // Reset umask
            close (0); // Close stdin
            close (1); // Close stdout
            close (2); // Close stderr
            execvp ( ... );
            _exit (0);
        }
        // Do I need waitpid (child) here?
    }
    // Write the child PID using the pipe
    write (fd[1], &child, sizeof (child));
    _exit (0);
}
else // Parent
{
    // Read the child PID using the pipe
    read (fd[0], &child, sizeof (child));
    // Remove zombie process
    waitpid (pid, nullptr, 0);
    // Child must finish exec by this point
    return Process (child);
        // Also gets name
}

问题:

  • 我是否需要第二个等待件才能等待孩子完成执行官?
  • WaitPid会在exec的电话时返回吗?
  • waitpid返回即使在waitpid之前被召集或执行?

您不需要在第二个孩子上 waitpid()。当一个过程的父母死亡时,孩子将被init流程采用,因此不会有僵尸过程。

waitpid()仅在孩子等待出口后才返回。在孩子中打电话给execvp()意味着服务员等待直到执行死亡的程序,因为那是孩子死亡的时候。

waitpid()将获得该过程的退出状态。该过程何时真正退出并不重要。

(一点澄清:您称之为孩子,实际上是您的孙子。这是该过程的孩子,只是分叉并死了。)

我是否需要第二个等待件才能等待孩子完成执行官?

你不能。这是您的孙子,您只能等待直接的孩子。此外,由于您的孙子的父母已经去世,因此您的孙子现在已经被调整为Init(因此实际上是您的前孙子)。

waitpid会在通话中返回exec吗?

给定的PID死亡/退出时,等待pid返回,或者如果已经是僵尸,则立即返回。高管在孙子中被召唤。您的等待电话完全不关心不是您的直接孩子的过程(除非您使用的是仅使用Linux的儿童提取功能)。

即使在waitpid之前召集了waitpid返回?

等待只有在PID上等待(必须是您的直接孩子)死亡时才返回。如果尚未这样,它将阻止。