3

这是我的代码:

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 childs 执行不同进程的正确方法吗?

PS对不起,我的英语不好。我希望你能明白我说的话。

4

3 回答 3

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);
        }
于 2013-01-02T01:13:35.723 回答
1

首先,fork启动并行进程,不保证会顺序运行

于 2013-01-02T01:13:18.267 回答
1

对于应该进行特殊处理的进程(即前四个)fork,在父进程中为它们中的每一个执行单独的步骤。然后循环创建您可能需要的所有通用流程。

于 2013-01-02T01:14:29.407 回答