0

我正在尝试执行和安排我自己的从文件中读取的进程列表。这些文件以随机顺序运行,我只是好奇为什么会这样。我在第一个、第二个等文件中有简单的打印语句,这些语句告诉哪个正在运行,它们总是以不同的(看似随机的)顺序打印。到目前为止,它并没有弄乱我的功能,我只是好奇为什么会这样。

main.c 下面

int main(int argc, char ** argv) {
    pid_t pid[50];
    pid_t wpid;
    int i, j;
    int status = 0;
    char *newenvp[] = {NULL};
    char *newargv[] = {"./files.txt", NULL};

    printf("Before forking in the parent\n");
    int numProgs = readPrograms();

    for (i=0; i<numProgs; i++) {
        pid[i] = fork();
        if (pid[i] < 0) {
            perror("fork error");
            exit(EXIT_FAILURE);
        }
        else if (pid[i] == 0) {
            printf("Child process running\n");
            execve(programs[i], newargv, newenvp);
            perror("execve error");
            exit(EXIT_FAILURE);
        }
    }
    for (i=0; i<numProgs; i++) {
        wait(&status);
    }
    return 0;
}
char* programs[50];
int readPrograms();

阅读下面的Programs.c

int readPrograms() {
    int i=0;
    char line[50];
    int numProgs = -1;

    FILE *file;
    file = fopen("files.txt", "r");

    while(fgets(line, sizeof(line), file)!=NULL) {
        line[strlen(line)-1] = '\0';
        programs[i]=strdup(line);
        i++;
        numProgs++;
    }
    fclose(file);
    return numProgs;
}

文件.txt 下面

./first
./second
./third
./fourth
4

1 回答 1

0

调用 fork 时,您的系统会创建新进程(复制自身、调用 exec、覆盖自身)。然后你的 fork 就准备好了,父进程和子进程都被标记为就绪,并且进程的运行顺序由你的系统调度程序选择。因此,根据您的调度程序,您的父母或您的孩子现在正在运行。

于 2014-10-29T08:06:52.023 回答