这是我的代码:
for (c = 0; c < PROCESSES; c++) {
pid[c] = fork();
switch (pid[c]) {
case -1:
perror("Faild fork!\n");
break;
case 0:
printf("C = %d\n", c);
if (c == 0) {
printf("MY ID0 %d\n", getpid());
customers();
break;
}
if (c == 1) {
printf("MY ID1 %d\n", getpid());
cashier();
break;
}
if (c == 2) {
printf("MY ID2 %d\n", getpid());
sales();
break;
}
if (c == 3) {
printf("MY ID3 %d\n", getpid());
warehouse();
break;
}
break;
default:
if (c == (PROCESSES - 1)) {
for (j = 0; j < PROCESSES; j++) {
w = wait(&state);
if (w == -1) {
perror("Erro na espera!\n");
}
printf("Terminar processo %d\n", w);
}
sleep(2);
printf("Fim da simulação.\n\n");
free_shm_sem();
}
}
}
我期待发生的事情:
C = 0
MY ID0 3904
C = 1
MY ID1 3905
C = 2
MY ID2 3906
C = 3
MY ID3 3907
发生了什么:
C = 0
MY ID0 3904
C = 1
MY ID1 3905
C = 2
MY ID2 3906
C = 3
MY ID3 3907
C = 3
MY ID3 3911
如果我改为:
if (c == 0) {
printf("MY ID0 %d\n", getpid());
customers();
break;
}
if (c == 1) {
printf("MY ID1 %d\n", getpid());
sales();
break;
}
if (c == 2) {
printf("MY ID2 %d\n", getpid());
cashier();
break;
}
if (c == 3) {
printf("MY ID3 %d\n", getpid());
warehouse();
break;
}
输出成为:
C = 0
C = 2
C = 1
MY ID0 3960
MY ID2 3962
C = 3
MY ID1 3961
MY ID3 3963
C = 2
MY ID2 3967
C = 3
MY ID3 3968
为什么c会改变它的值,有时会两次经过同一个地方?
这不是fork()n孩子做不同进程的正确方法吗?
P.S。对不起,我的英语不好。我希望你能理解我说的话。
答案 0 :(得分:6)
您是否正在考虑所有分叉进程继续迭代for循环并分叉更多进程的事实?
考虑第一次迭代:
for (c = 0; c < PROCESSES; c++) { // c is 0
我们做一个分叉:
pid[c] = fork();
现在,在子进程中,pid[0]
为0.所以,
switch (pid[c]) {
进入:
case 0:
if (c == 0) {
printf("MY ID0 %d\n", getpid());
customers();
break;
}
并进行一些打印。然后它就会掉出开关。并且c
为0.因此它将c
增加到1,并执行:
pid[c] = fork();
分叉一个大孩子。
为了防止这种情况发生,您可以exit
代替break
:
if (c == 0) {
printf("MY ID0 %d\n", getpid());
customers();
exit(0);
}
答案 1 :(得分:1)
首先,fork
启动并行进程,无法保证它将按顺序运行
答案 2 :(得分:1)
对于应该进行特殊处理的进程(即前四个进程),在父进程中为每个进程调用fork
。然后创建一个循环,创建您可能需要的所有通用流程。