有名管道(pipe)
有名管道的属性:
1)有名管道可以使互不相关的两个进程互相通信
2)有名管道可以通过路径名来指出,并且在文件系统中可见,管道中的数据,在内核的内存
3)进程通过文件IO来操作有名管道
4)有名管道遵循先进先出规则
5)不支持如lseek() 操作
write.c
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#define N 128
int main(int argc, char *argv[])
{
int fd;
char buf[N] = "";
int ret;
ret = mkfifo("fifo", 0664);
if(ret < 0){
if(errno == EEXIST){
fd = open("fifo", O_RDWR);
printf("fd = %d\n", fd);
}
else{
//如果执行错误不是因为文件存在而引起的错误
perror("mkfifo error");
return -1;
}
}
else{
fd = open("fifo", O_RDWR);
printf("fd = %d\n", fd);
}
puts("start write...");
while(1){
fgets(buf, N, stdin);
buf[strlen(buf) - 1] = '\0';
write(fd, buf, strlen(buf));
if(strncmp(buf, "quit", 4) == 0){
break;
}
}
return 0;
}
read.c
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#define N 128
int main(int argc, char *argv[])
{
int fd;
char buf[N] = "";
int ret;
ret = mkfifo("fifo", 0664);
if(ret < 0){
if(errno == EEXIST){
fd = open("fifo", O_RDWR);
printf("fd = %d\n", fd);
}
else{
//如果执行错误不是因为文件存在而引起的错误
perror("mkfifo error");
return -1;
}
}
else{
fd = open("fifo", O_RDWR);
printf("fd = %d\n", fd);
}
puts("start read...");
while(1){
read(fd, buf, N);
if(strncmp(buf, "quit", 4) == 0){
break;
}
printf("buf = %s\n", buf);
}
return 0;
}