C:运行所有命令后,多进程CMD不执行任何操作

时间:2019-12-06 21:37:02

标签: c cmd concurrency

我用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;
}

老实说,我不知道问题是什么,也不知道该如何解决。有人可以解释为什么这样做吗?

编辑:取出行号

1 个答案:

答案 0 :(得分:2)

是否有一些子进程的输出显示在shell提示上的问题?

这是因为您不必等待所有子进程,而只需等待最后一个。并且不能保证子进程将以任何特定顺序执行。

这意味着您的父进程可以在所有子进程完成之前退出,这意味着Shell已恢复控制并显示提示。

您应该真正等待所有所有子进程。如果希望子进程并行运行,最好在第二个循环中。