使用execl()执行连续进程

时间:2013-03-31 12:02:17

标签: c++ unix process

我希望这是一个简单的问题。我想连续执行三个名为“brute_seq”,“brute_pth”和“brute_omp”的程序;基本上执行“brute_seq”,等到它完成,然后为“brute_omp”执行“brute_pth”和同样的事情。

我尝试过这几种不同的方式,到目前为止,我提出的最好的解决方案就是这个,虽然这不是我需要的。

#include <unistd.h>
int main()
{
    if(fork() == 0)
        execl("brute_seq", (const char*)NULL, (char*)NULL);

    if(fork() == 0)
        execl("brute_pth", (const char*)NULL, (char*)NULL);

    if(fork() == 0)
        execl("brute_omp", (const char*)NULL, (char*)NULL);
    return 0;
}

根据我的理解,分叉进程将运行execl()命令,而该命令又将分叉进程替换为被调用进程 - 这确保了我的分叉进程在被调用进程结束时终止。

这个实现有两个问题:

  1. 进程不按顺序执行,而是并行执行,这是我不想要的。
  2. 一旦完成所有操作,我的终端会以类似的方式阻塞,因为同步性较差而遇到死锁时会阻塞,但更糟糕的是,因为我无法将CTRL-Z从中移出;我必须从终端退出并再次打开它。
  3. 有什么想法吗?


    感谢Joachim的有用提示,这里的工作代码完全符合我的要求:

    #include <sys/wait.h>
    #include <unistd.h>
    int main()
    {
        pid_t child_pid;
        int status;
    
        if((child_pid = fork()) == 0)
            execl("brute_seq", (const char*)NULL, (char*)NULL);
        else
        {
            waitpid(child_pid, &status, 0);
            if((child_pid = fork()) == 0)
            {
                execl("brute_pth", (const char*)NULL, (char*)NULL);
            }
            waitpid(child_pid, &status, 0);
            execl("brute_omp", (const char*)NULL, (char*)NULL);
        }
        return 0;
    }
    

1 个答案:

答案 0 :(得分:1)

您必须wait完成流程。它还具有在完成后清理孩子僵尸进程的副作用。