我有一个希望是一个简单的问题。我想连续执行三个名为“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() 命令,该命令又将用被调用的进程替换分叉的进程——这确保了我的分叉进程在被调用的进程结束时终止。
我对这个实现有两个问题:
- 这些进程不是按顺序执行的,而是并行执行的,这是我不想要的。
- 一旦它们都执行完毕,我的终端会以类似的方式阻塞,就像遇到由于同步不佳而导致死锁时它会阻塞一样,除了更糟糕的是,因为我无法 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;
}