C中的并行编程不执行指令
Parallel programming in C not executing instructions
我需要 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
为什么程序不写其他指令,为什么要写两次"block B instructions"?
-------------------- 编辑:--------------------
新代码是:
#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 编译它,但没有收到任何错误消息
<stdio.h>
是 buffered, see stdio(3) and setvbuf(3). You should call fflush(3) at appropriate places, in particular before fork(2)。
顺便说一句,你的标准 libc 的代码是 free software, probably GNU glibc. Of course it uses syscalls(2)。所以你应该研究它的源代码。
另读How to debug small programs
printf("\nBlock C instructions");
容易出错。 \n
可以刷新缓冲区,实际上应该用作 printf(3) 控制格式字符串的最后一个字符。
由于exit(0)
,它不会打印其他指令,因此它永远不会到达G和H块。对于被打印两次的 B,请参阅 Basile Starynkevitch 的回答。
我需要 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
为什么程序不写其他指令,为什么要写两次"block B instructions"?
-------------------- 编辑:--------------------
新代码是:
#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 编译它,但没有收到任何错误消息
<stdio.h>
是 buffered, see stdio(3) and setvbuf(3). You should call fflush(3) at appropriate places, in particular before fork(2)。
顺便说一句,你的标准 libc 的代码是 free software, probably GNU glibc. Of course it uses syscalls(2)。所以你应该研究它的源代码。
另读How to debug small programs
printf("\nBlock C instructions");
容易出错。 \n
可以刷新缓冲区,实际上应该用作 printf(3) 控制格式字符串的最后一个字符。
由于exit(0)
,它不会打印其他指令,因此它永远不会到达G和H块。对于被打印两次的 B,请参阅 Basile Starynkevitch 的回答。