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);