我试图执行并安排从文件中读取的自己的进程列表。文件以随机顺序运行,我只是好奇为什么会发生这种情况。我在第一个,第二个等文件中有简单的打印语句,它们告诉哪些文件正在运行,并且它们总是以不同的(看似随机的)顺序打印。到目前为止,它并没有弄乱我的功能,我只是好奇为什么会这样。
下面的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();
下面的readPrograms.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
答案 0 :(得分:0)
调用fork时,系统会创建新进程(复制本身,调用exec,覆盖自身)。 然后您的fork已准备好,父进程和子进程都已标记为就绪,并且系统调度程序将选择进程的运行顺序。 因此,根据您的日程安排程序,您的父母或您的孩子现在都在运行。