【发布时间】:2020-01-28 02:49:35
【问题描述】:
// I have commands in commands[] array
pid_t pid[command_count];
for (int i = 0; i < command_count; i++) {
if ((pid[i]=fork()) == 0) {
printf("--%s\n", commands[i][0]);
execvp(commands[i][0],commands[i]);
_exit(1);
}
if (pid[i] < 0) {
}
}
for (i = 0; i < command_count; i++) {
if (pid[i] > 0) {
int status;
waitpid(pid[i], &status, 0);
}
}
我有上面的代码,想一次(并行)运行命令数组中的命令,并且在每次运行之前,想打印命令。例如;
ls | pwd | ls -a
它应该在命令运行之前打印每个命令名称
--ls
.. a b.txt
--pwd
/a/a/
--ls -a
*some output*
但它打印如下
--ls
--pwd
--ls -a
.. a b.txt
*some directory as a result of pwd*
*some output*
可能是什么原因,我该如何解决?
【问题讨论】:
-
您希望程序同时运行,这意味着输出将是交错的,并且您还希望输出顺序。这是两个相互矛盾的要求。您可能可以使用作业控制原语做一些事情,以便子进程在 SIGTTOU 或类似的东西上被阻止,但您没有提到那种复杂性,所以这可能不是您应该做的事情.如果您在循环中等待每个进程,您将获得顺序输出,而不是并发(异步)执行。