Linux之IPC通信

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;
            }
    内置限制:
        可通过配置内核来改变。
        
    优点:
        系统范围内起作用,没有引用计数。
        
        
    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值