首页 > 解决方案 > C中的并行编程不执行指令

问题描述

我需要 C 并行编程方面的帮助,来自这张图: graph image

我写了这段代码:

#include <stdio.h>
#include <stdlib.h>
int main ()
{
    int r2;
    printf("---------   Program start   ---------");
    printf("\nBlock A instructions"); //block A
    printf("\nBlock B instructions"); //block B
    r2= fork();
    if (r2==0){ //child
        printf("\nBlock E instructions"); //block E
        printf("\nBlock F instructions"); //block F
        exit(0);
    }
    else{
        if (r2>0){ //father
            printf("\nBlock C instructions"); //block C
            printf("\nBlock D instructions"); //block D
            exit(0);
        }
        else printf("\nError");
    }
    printf("\nBlock G instructions"); //block G
    printf("\nBlock H instructions"); //block H
    printf("\n---------   Program finish   ---------");
}

输出是:

---------   Program start   ---------
Block A instructions
Block B instructions
Block E instructions
Block F instructionsBlock B instructions
Block C instructions
Block D instructions

为什么程序不写其他指令,为什么写两次“块B指令”?

- - - - - - - - - - - 编辑: - - - - - - - - - - -

新代码是:

#include <stdio.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <unistd.h>
int main ()
{
    printf("---------   Program start   ---------\n");
    printf("Block A instructions\n"); //block A
    printf("Block B instructions\n"); //block B
    fflush(stdout);
    pid_t r2= fork();
    if (r2==0){ //child
        printf("Block E instructions\n"); //block E
        printf("Block F instructions\n"); //block F
        fflush(stdout);
        exit(1);
    }
    else{
        if (r2>0){ //father
            printf("Block C instructions\n"); //block C
            printf("Block D instructions\n"); //block D
            fflush(stdout);
            wait(NULL); //wait for child process to join with this parent, returns no value
        }
        else printf("Error");
    }
    printf("Block G instructions\n"); //block G
    printf("Block H instructions\n"); //block H
    printf("---------   Program finish   ---------");
    return 0;
}

现在的输出是:

---------   Program start   ---------
Block A instructions
Block B instructions
Block E instructions
Block F instructions
Block C instructions
Block D instructions
Block G instructions
Block H instructions
---------   Program finish   ---------

有时 C 和 D 指令写在 E 和 F 指令之前,这是正常的还是应该总是 EF --> CD ?顺便说一句,代码好还是有一些错误?我用 -Wall 编译它,但没有收到任何错误消息

标签: cparallel-processingforkoperator-precedence

解决方案


<stdio.h>缓冲,见stdio(3)setvbuf(3)。您应该在适当的地方调用fflush(3) ,特别是在fork(2)之前。

顺便说一句,您的标准 libc 的代码是free software,可能是GNU glibc。当然它使用syscalls(2)。所以你应该研究它的源代码。

另请阅读如何调试小程序

printf("\nBlock C instructions");

容易出错。可以刷新缓冲区,\n实际上应该用作printf(3)控制格式字符串的最后一个字符。


推荐阅读