(一) 编写一个关于进程通信的简单程序,子进程送一串消息给父进程,父进程收到消息后把它显示出来。
要求:
两个子进程分别向管道写一句话:
Child process 1 is sending a message!
Child process 2 is sending a message!
而父进程则从管道中读出来自两个子进程的消息,显示屏幕上,且父进程要先接收子进程1的消息,在接受子进程2的消息。
#include<stdio.h>
#include<string.h>
#include<unistd.h>
#define SIZE 50
int main()
{
int p1, p2;
int fd[2];
char str[50];
while((pipe(fd)) == -1);
while((p1 = fork()) == -1);
if(p1)
{
while((p2 = fork()) == -1);
if(p2)
{
//parent
wait(0);
read(fd[0], str, SIZE);
printf("%s\n", str);
wait(0);
read(fd[0], str, SIZE);
printf("%s\n", str);
}
else
{
//child2
lockf(fd[1], 1, 0);
sleep(2);
strcpy(str, "Child process 2 is sending messages!\n");
write(fd[1], str, SIZE);
lockf(fd[1], 0, 0);
}
}
else
{
//child1
lockf(fd[1], 1, 0);
sleep(2);
strcpy(str, "Child process 1 is sending messages!\n");
write(fd[1], str, SIZE);
//sleep(2);
lockf(fd[1], 0, 0);
}
}
(二)父进程等待用户从控制台(键盘)输入字符串,通过管道传给子进程;子进程收到后,对字符串进行大小写转换后,输出到标准输出(显示器)。
#include<stdio.h>
#include<string.h>
#include<unistd.h>
#define SIZE 50
int main()
{
int p, fd[2];
int i = 0;
char str[SIZE];
while((pipe(fd)) == -1);
while((p = fork()) == -1);
if(p)
{
//parent
lockf(fd[1], 1, 0);
printf("Please input the string:");
scanf("%s", str);
write(fd[1], str, SIZE);
lockf(fd[1], 0, 0);
wait(0);
read(fd[0], str, SIZE);
printf("reversed string is : %s\n", str);
}
else
{
read(fd[0], str, SIZE);
while(str[i] != '\0')
{
if('A' <= str[i] && str[i] <= 'Z')
{
str[i] += 32;
}
else if('a' <= str[i] && str[i] <= 'z')
{
str[i] -= 32;
}
i++;
}
write(fd[1], str, SIZE);
}
return 0;
}