(1)什么是无名管道
1、只可以应用在亲缘进程之间进行通信。
2、有两个描述符,一个为读(0),一个为写(1)。
3、管道通信之前需要先创建进程fork()/vfork()。
4、只可单向通信。
(2)建立无名管道
pipe(int fd[2]);
fd:两个读写的描述符。每次需要关闭一个开启一个。
成功返回0,失败返回-1.
流程:
创建进程——创建管道——在子/父进程中——关闭读/写端口——写/读内容——关闭写/读端口
#include
#include
#include
#include
#include
int main()
{
int i;
int fd1[2];
int fd2[2];
int pid,pid2;
char r_buf[100];
char w_buf[100];
char name[100];
memset(r_buf,0,sizeof(r_buf));
memset(w_buf,0,sizeof(w_buf));
if(pipe(fd1) < 0 || pipe(fd2) < 0)
{
printf("pipe create fail!\n");
}
if((pid = fork()) == 0)
{
close(fd1[1]);
close(fd2[0]);
sleep(1);
read(fd1[0],r_buf,100);
for(i = 0;i < 100;i++)
{
if(r_buf[i] > 'a' && r_buf[i] < 'z')
{
r_buf[i] -= 32;
}
}
write(fd2[1],r_buf,strlen(r_buf));
close(fd1[0]);
close(fd2[1]);
exit(0);
}
else if(pid > 0)
{
close(fd1[0]);
close(fd2[1]);
sleep(1);
printf("Please input:\n");
scanf("%s",name);
strcpy(w_buf,name);
write(fd1[1],w_buf,strlen(w_buf));
read(fd2[0],w_buf,100);
printf("%s",w_buf);
close(fd1[1]);
close(fd2[0]);
}
}
(1)有名管道
1、解决了非亲缘之间的通信
2、通过以FIFO文件的形式存于文件系统之中。
3、遵循先进先出。
(2)建立有名管道
mkfifo(const char * pathname,mode_t mode);
pathname:文件路径
mode:权限
read:
#include
#include
#include
#include
#include
#include
#include
#define FIFO_SERVER "/home/1703/namepipe/fifoserver"
int main(int argc,char ** argv)
{
char r_buf[1024*8];
int fd;
int r_size;
int ret_size;
r_size = atoi(argv[1]);
printf("The real size is %d\n",r_size);
memset(r_buf,0,sizeof(r_buf));
fd = open(FIFO_SERVER,O_RDONLY);
if(fd == -1)
{
printf("open fail!\n");
exit(-1);
}
while(1)
{
memset(r_buf,0,sizeof(r_buf));
ret_size = read(fd,r_buf,r_size);
if(ret_size == -1)
{
if(errno == EAGAIN)
printf("no data!\n");
}
else
{
if(ret_size == 0)
exit(-1);
printf("The real string is %s,num is %d \n",r_buf,ret_size);
sleep(1);
}
}
unlink(FIFO_SERVER);
}
write:
#include
#include
#include
#include
#include
#include
#define FIFO_SERVER "/home/1703/namepipe/fifoserver"
int main()
{
int fd;
char w_buf[1024*8];
int real_wnum;
memset(w_buf,0,sizeof(w_buf));
if((mkfifo(FIFO_SERVER,O_CREAT|O_EXCL) < 0)&&(errno != EEXIST))
{
printf("cannot create fifoserver\n");
exit(-1);
}
fd = open(FIFO_SERVER,O_WRONLY);
if(fd == -1)
{
if(errno == ENXIO)
printf("open error!\n");
}
while(1)
{
printf("Please input characters:\n");
scanf("%s",w_buf);
if(strcmp(w_buf,"end") == 0)
{
exit(0);
}
real_wnum = write(fd,w_buf,strlen(w_buf));
if(real_wnum == -1)
{
if(errno == EAGAIN)
{
printf("write to file fail!\n");
}
}
else
printf("input %d characters!\n",real_wnum);
}
unlink(FIFO_SERVER);
}