我用C语言编写了这个代码,它确实并发运行所有命令。但是最后,它将最后一个命令放入CMD的用户输入部分,然后紧随其后。 这是命令的输出:
hen03:~/Lab_08> ./assign8 whoami , ls -a , pwd
Child Process: PID=11895, PPID=11894, Command=whoami
Child Process: PID=11897, PPID=11894, Command=pwd
Child Process: PID=11896, PPID=11894, Command=ls
/home/uid454/Lab_08
hen03:~/Lab_08> . .. assign8 assign8.c makefile uid454.zip
uid454
hen03:~/Lab_08>
这是我编写的代码
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <wait.h>
void startProcesses(int commands, char *commandList[6][100]){
static pid_t forks[6];
int status[6];
int i;
for(i = 0; i < commands; i++){
switch(forks[i] = fork()){
case -1: //failed
perror("fork failed");
break;
case 0: //child does things
printf("Child Process: PID=%ld, PPID=%ld, Command=%s\n", (long) getpid(), (long) getppid(), commandList[i][0]);
if(execvp(commandList[i][0], commandList[i]) < 0){
printf("something failed\n");
}
break;
default:
if(i == commands-1){
waitpid(forks[i], &status[i], 0);
}
}
}
}
int main(int argc, char *argv[])
{
int commandNum = 0, index, numOfCommands = 1, j =0;
static char *commandList[6][100];
//start of separate algo
for (index = 1; index < argc; index++){
if(strcmp(strtok(argv[index], " "), ",") == 0){
commandNum++;
numOfCommands++;
commandList[commandNum-1][j] = NULL;
j = 0;
continue;
}
else{
commandList[commandNum][j] = argv[index];
j++;
}
}
//end of separation algo
startProcesses(numOfCommands, commandList);
return 0;
}
老实说,我不知道问题是什么,也不知道该如何解决。有人可以解释为什么这样做吗?
编辑:取出行号
答案 0 :(得分:2)
是否有一些子进程的输出显示在shell提示上的问题?
这是因为您不必等待所有子进程,而只需等待最后一个。并且不能保证子进程将以任何特定顺序执行。
这意味着您的父进程可以在所有子进程完成之前退出,这意味着Shell已恢复控制并显示提示。
您应该真正等待所有所有子进程。如果希望子进程并行运行,最好在第二个循环中。