FIFO:
目的:
不相关进程间通信
函数:
int mkfifo(const char *path, mode_t mode);
int mkfifoat(int fd, const char *path, mode_t mode); //在fd表示的目录相关位置创建一个FIFO.
(1)path绝对路径,fd被忽略
(2)path相对路径,fd是有效文件描述符,路径名和目录有关
(3)path相对路径,fd值为AT_FDCWD,路径名从当前目录开始。
创建FIFO时,需要调用open打开,O_NONBLOCK产生下列影响
(1)一般情况,只读open阻塞到某个其他进程为写而打开这个FIFO为止
(2)指定O_NOBLOCK, 只读open直接返回,如果没有一个进程为读而打开一个FIFO,只写open返回-1,errno设置成ENXIO;
write一个尚无进程为读而打开的FIFO,产生信号SIGPIPE.某个FIFO最后一个写进程关闭了FIFO, 为FIFO的读进程产生一个
文件结束标志。
一个FIFO上有多个写进程,不希望多个进程所写的数据交叉,必须考虑原子性。常量PIPE_BUF说明可被原子地写到FIFO地最大数据量。
作用:
(1)shell命令使用FIFO将数据从一条管道传送到另一条,无需创建临时文件
(2)客户-服务进程应用程序,FIFO用作汇聚点,在客户和服务进程二者之间传递数据。
XSI IPC:
消息队列:
信号量:
共享存储器:
IPC结构:
非负整数地标识符加以引用。IPC结构被创建,然后删除,标识符连续加1,直到整型数地最大值,然后转到0;标识符时
IPC对象地内部名称。为了使多个进程汇聚在同一个IPC对象上,需要提供外部命名方案。IPC对象同key关联,key作为
外部名。创建IPC对象时需要指定key, key的数据类型时key_t,在<sys/types.h>中定义。key被内核转换为
标识符。
是多个进程在IPC对象上汇聚的方法:
(1)服务器进程指定key IPC_PRIVATE创建新IPC对象,返回的标识符放在某处供客户程序取用。
(2)公用头文件中定义一个客户进程和服务器认可的key
(3)服务器和客户进程认可同一个路径名和项目ID,调用ftok将两个值转换为ky,然后在方法2中使用此key;
key_t ftok(const char *path, int id); // path必须引用现有的文件
flag; IPC_CREAT标志位
IPC_CREAT | IPC_EXEC: 确保无相同标识符的IPC对象被创建
无法通过IPC_PRIVATE这个key引用队列,一定要知道这个相关的标识符,在IPC调用张使用该标识符。
IPC权限:
数据结构:
<sys/ipc.h>
struct ipc_perm {
uid_t uid;
git_t gid;
uid_t cuid;
gid_t cgid;
mode_t mode;
}
内置限制:
可通过配置内核来改变。
优点:
系统范围内起作用,没有引用计数。
Linux之IPC通信
最新推荐文章于 2023-01-20 23:11:06 发布