int mkfifo(const char *pathname, mode_t mode);
//第一个参数:pathname为创建的有名管道的全路径名
//第二个参数:mode为创建的有名管道的模式
有名管道相比无名就只是有名管道的数据会以可读可写的文件形式存在,而且有名管道可以用于两个没有关系的进程之间的通信,而无名管道只能用于父子进程和兄弟进程。
但不管有名管道还是无名管道,都是属于半双工的通信方式。
直接上栗子:
下面这个是“写_进程”的代码:
int main()
{
int fd; //创建有名管道后生成的文件打开时的文件描述符
char *str = "wo shi zhen de shuai a";
int len = strlen(str); //写入的字符串的长度
fd = open("./tutou",O_WRONLY); //写的时候要以写的方式打开
if(fd > 0){printf("write open success\n");} //打印信息提示只写打开成功
while(1) //一直写上面那句字符串信息,每3秒写一次
{
write(fd,str,len);
sleep(3);
}
close(fd); //跟普通文件一样,打开了以后不用了就要关掉它
return 0;
}
。
。
下面这部分是“读_进程”的代码
int main()
{
int fd;
char str[1024] = {0}; //这里写死了,总想改进一下
if(mkfifo("./tutou",0600) == -1 && errno != EEXIST) //用mkfifo函数创建管道,如果创建失败或已存在都会返回 “-1”,的这部分就是让除了“管道已存在”以外的错误才打印错误信息
{
printf("make fifo failed\n");
perror("why");
}
fd = open("./tutou",O_RDONLY); //只读打开
if(fd > 0){printf("read open success\n");}
while(1)
{
read(fd,str,1024); //直接读1024的长度这也是上面提到的总觉得可以改进一下的地方
printf("context:%s\n",str);
}
close(fd);
return 0;
}
代码编译以后,用两个shell框分别运行两个代码,从进程上说,那就是两个进程了
从代码上可以看出,写完以后,我们运行的时候是先运行读的程序,再运行写的程序,因为创建管道的代码在读的那一部分
。
。
。
后面我又对读的那一部分做出了修改,目的是为了不把读字符串的长度写死,但最后还是没有成功,后面再慢慢磨吧,先上代码
int main()
{
int fd;
//char str[1024] = {0}; //这里写死了,总想改进一下
char *str = NULL;
int len=0;
if(nkfifo("./tutou",0600) == -1 && errno != EEXIST)
{
printf("make fifo failed\n");
perror("why");
}
fd = open("./tutou",O_RDONLY); //只读打开
if(fd > 0){printf("read open success\n");}
while(1)
{
len = lseek(fd,0,SEEK_END); //首先把光标移到最后面,返回值len就是整个字符串的长度
printf("len = %d",len); //打印出长度看是否正确
lseek(fd,0,SEEK_SET); //再把光标移回开头,否则读取不了
str = char *malloc(sizeof(char)*len+10); //给指针分配空间
read(fd,str,len); //读取
printf("context:%s\n",str);
}
close(fd);
return 0;
}
思路上其实也是有点问题的,但当时就是想试试看能不能而已,从结果的反馈来看,主要就是获取不了它字符串的长度,导致后面无法正常读取,其实也是,首先写代码的时候是默认读写阻塞的,读之前没有写入,它是无法读取的,但是吧,移动光标到底属于什么操作呢,是读还是写,后面再去验证一下,考虑把他放到写那里,或者试一下不要读写阻塞,看看效果会怎么样。