1

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

我已经尝试了几种不同的方法,到目前为止,我想出的最好的解决方案就是这个,虽然这不是我所需要的。

#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 退出它;我必须从终端退出并再次打开它。

有任何想法吗?


感谢 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;
}
4

1 回答 1

1

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

于 2013-03-31T12:09:44.517 回答