创建父子2个进程A,B。进程A不断获取用户从键盘输入的字符串或整数,通过信号机制传给进程B。如果输入的是字符串,进程B将其打印出来;如果输入的是整数,进程B将其累加起来,并输出该数和累加的和。当累加和大于100时结束子进程,子进程输出“My work done!”后结束,然后父进程也结束。编写程序实现,并给出测试结果。
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <strings.h>
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 : %d\n", num);
printf ("sum of number : %d\n", 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 ("%s\n", 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);
}
}
结果: