(1)代码实现的功能:
父进创建无名管道程,调用fork()函数创建子进程,父进程向无名管道的写端写入数据,子进程从无名管道的读端读取数据。
(2)注意点1:
无名管道的通信方式为半双工,读写端分开,因此读端应该关闭写管道文件描述符fd[1];写端关闭读描述符fd[0]
(3)注意点2:
无名管道的写入不具有原子性,只适用于1对1亲缘进程的通信。不能像文件一样open和lseek。
(4)关闭文件描述符是取消这个进程与某一文件的联系,打开文件就是建立这个联系。所以普通文件可以同时被多个文件打开,也就是多个进程和文件建立联系。(个人理解)。
/*个人代码的运行环境为:ubuntu 16.04
编译工具:gcc*/
#include <stdio.h>
#include <unistd.h>
#include <errno.h>
#include <stdlib.h>
#include <string.h>
int main()
{
int fd[2];
int err = pipe(fd);
if(err == -1)
{
perror("create pipe failed:\n");
exit(0);
}
pid_t num = fork();
if(num == 0)
{
printf("fd[1]:%d\n",fd[1]);
close(fd[1]);
char get[50];
int get_num = read(fd[0],get,50);
printf("%s\n",get);
close(fd[0]);
}
else if(num > 0)
{
printf("fd[1]:%d\n",fd[1]);
close(fd[0]);
char sent[50];
printf("input msessage:");
scanf("%s",sent);
write(fd[1],sent,strlen(sent)+1);
wait(NULL);
}
else
{
perror("create son process failed:\n");
}
}