Posix标准IPC笔记-1

        1、/usr/src/include 下的 errno.h 头文件下声明了一个全局变量 errno ,每一个Unix函数在发生错误时都会设置 errno 。在多线程环境下,每一个线程拥有自己的errno变量。 

        2、为了便于移植,Posix IPC名字必须以斜杠符开头,并且不能再含有其他任何斜杠符。IPC的名字即是传给函数 mq_open, sem_open,和shm_open 的第一个参数。此外,为了避免还有可能出现的移植问题,还应该将Posix IPC名字的#diefne行放置于一个容易修改的头文件中。例如将#define MQ_NAME "/father" 置于代码头文件。

        3、管道创建函数 int pipe(fd[2]) 位于unistd.h头文件,其典型用途时用于两个不同进程(父子进程)之间的通信。 fd[0] 为读端, fd[1] 为写端。 进程首先创建出一个管道,然后 fork ,进程各关闭一个端口,构成封闭数据流。如果需要构造一个双向的管道,则在 fork 前需要创建两个管道,进程各关闭每个管道的一个端口,构成封闭的数据流向。

        4、管道由于没有名字,因此只能用于有一个共同祖先的各个进程之间。而每一个 FIFO 都有一个路径名与之关联,从而可以允许没有亲缘关系的进程访问统一 FIFO 。 FIFO 也叫“有名管道”。创建 FIFO 的函数,int mkfifo(const char *pathname, mode_t mode) 。mkfifo 已经隐含指定了O_CREAT | O_EXCL,也就是说,要么穿件一个新的 FIFO ,要么返回一个 EEXIST(如果所指定名字的FIFO存在的话)。

5、管道与FIFO的不同之处:管道的创建并打开只需要一个 pipe 函数,而创建并打开一个 FIFO 则需要在 mkfifo 之后调用再调用 open 函数;管道在所有进程最终都关闭后自动消失,而 FIFO 的名字则只有通过调用 unlink 才能从系统中删除。

//创建两个 FIFO 举例 
#define FIFO1 "/tmp/fifo.1" 
#define FIFO2 "/tmp/fifo.2" 
#define FILE_MODE S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH 
... 
if ((mkfifo(FIFO1, FILE_MODE) < 0) && (errno != EEXIST)) 
err_sys("can't create %s\n", FIFO1); 
if ((mkfifo(FIFO2, FILE_MODE) < 0) && (errno != EEXIST)) 
{ 
unlink(FIFO1); 
err_sys("can't create %s\n", FIFO2);
} 
...
 read_fd = open(FIFO1, O_RONLY, 0); 
write_fd = open(FIFO2, O_WONLY, 0);






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值