在任何情况下都无需等待即可从子进程获取 exec*() 的结果(不使用管道和 vfork())

问题描述 投票:0回答:0

我现在正在为特定于 Unix 的系统调用开发自定义包装器。我遇到的最后一个问题是关于如何创建一个完整的函数来使用另一个图像创建新进程。我希望此函数返回 TRUE 或 FALSE。这个难题的最后一块是如何从子进程中获得 exec*() 的结果,而无需等待它在 exec*() 成功的情况下结束。换句话说,我需要快速获得 exec*() 的 FAIL of SUCCESS 结果并继续执行父进程。

我不想用 vfork() 和管道。

我目前的成绩:

使用 vfork() 和一个 volatile 变量来保持结果使他们的工作。

static int QCreateProcess(char* args, ...)
{
    if (processInfoStruct == NULL)
    {
        return Q_ERROR;
    }
    
    volatile int result = TRUE;
    
    pid_t procHandle = vfork();
    if (procHandle == 0)
    {
        char* argsToExec[2] = { args, NULL };
        execv(argsToExec[0], argsToExec);
    
        result = FALSE;
        _exit(EXIT_FAILURE);
    }
    else if (procHandle == -1)
    {
        processInfoStruct->processHandle = NULL;
        result = FALSE;
    }
    else
    {
        if (result == TRUE)
        {
            waitpid(procHandle, NULL, WNOHANG);
            processInfoStruct->processHandle = procHandle;
        }
        else
        {
            processInfoStruct->processHandle = 0;
            result = FALSE;
        }
    }
    
    return result;
}

此代码有效并返回正确的结果。

如何在没有状态变量的情况下使用 fork()waitpid() 来实现(无论如何它都不能与 fork() 一起工作......)和管道?我试图为最后一个功能 (waitpid()) 找到不同选项的解决方案,但没有找到所需的组合。

c linux fork waitpid execv
© www.soinside.com 2019 - 2024. All rights reserved.