【问题标题】:How to fork() n child processes doing diferrent functions?如何 fork() n 个子进程执行不同的功能?
【发布时间】:2012-12-16 10:52:00
【问题描述】:

这是我的代码:

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

附:对不起,我的英语不好。我希望你能明白我所说的。

【问题讨论】:

    标签: c multiprocessing fork


    【解决方案1】:

    您是否正在考虑您的所有分叉进程继续迭代 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);
            }
    

    【讨论】:

    • 你的意思是一些子进程正在分叉自己的子进程?
    • 这让我很困惑,因为有 if 条件。
    • 您说每个子进程都在分叉一些其他进程,对吧?但它会引起它的内部原因吗?我怎么能 fork 4 个进程并等待它们?
    • 它会等待他们,当他们exit时它会继续
    • 谢谢你,你解决了我的问题。我将其更改为退出,现在我所有的流程都很和谐:)
    【解决方案2】:

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

    【讨论】:

    • 我不希望它按顺序运行。但是,如果您理解,我不想要重复的过程...
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2015-04-28
      • 1970-01-01
      • 1970-01-01
      • 2015-01-05
      • 2019-05-13
      • 1970-01-01
      • 2020-11-24
      • 2014-06-17
      • 2012-11-22
      相关资源
      最近更新 更多