创建父子2个进程A,B。进程A不断获取用户从键盘输入的字符串或整数,通过信号机制传给进程B。如果输入的是字符串,进程B将其打印出来;如果输入的是整数,进程B将其累加起来,并输出该数和累加的和。当累加和大于100时结束子进程,子进程输出“My work done!”后结束,然后父进程也结束。编写程序实现,并给出测试结果。
#include#include #include #include #include main(){ int r, p, fd1[2], fd2[2]; char buf[50], s[50], massr[50]; char flag[50] = "My work is dong!"; char massw[50] = "My work done!"; int i = 0, sum = 0, num = 0; pipe(fd1); //父进程建立管道 pipe(fd2); while((p = fork()) == -1); if(p == 0){ //由子进程P1返回,执行子进程P1 close(fd1[1]); //关闭管道1写入端 close(fd2[0]); //关闭管道2读出端 write(fd2[1], flag, 50); while(read(fd1[0], s, 50)){ while(s[i] >= '0' &&s[i] <= '9'){ i++; } if(i == strlen(s)){ num = atoi(s); sum += num; printf ("message is number : %dn", num); printf ("sum of number : %dn", sum); if(sum > 100){ write(fd2[1], massw, 50); printf ("My work done!n"); sleep(1); break; }else{ write(fd2[1], flag, 50); sleep(1); } }else{ printf ("message of child process receive:n"); printf ("%sn", s); write(fd2[1], flag, 50); sleep(1); } } exit(0); //关闭 }else{ close(fd1[0]); close(fd2[1]); while(read(fd2[0], massr, 50)){ if(strcmp(massr, "My work done!") == 0) { printf ("receive My work done, program is exiting!n"); break; }else{ printf ("please input your message!n"); scanf("%s", buf); write(fd1[1], buf, 50); //把buf中的50个字符写入管道 sleep(1); //睡眠5秒,让子进程读 } } printf ("exited!n"); exit(0); } }
结果:



