函数 | 说明 | 成功 | 失败 |
---|---|---|---|
管道和FIFO | |||
pipe | 单工通讯 | 0 | -1 |
popen | 执行一个shell命令,封装的PIPE和exec功能 | 文件指针 | NULL |
pclose | 关闭标准I/O流,等待命令终止,而后返回shell的终止状态 | 返回cmdstring的终止状态 | -1 |
mkfifo | 打开一个fifo文件 | 0 | -1 |
mkfifoat | 打开一个fifo文件 | 0 | -1 |
IPC的操做 | |||
ftok | 路径和id建立一个IPC的key | 返回key | -1 |
消息队列 | 不推荐使用,FIFO代替 | ||
msgget | 建立一个消息队列 | 返回消息队列ID | -1 |
msgctl | 修改消息队列的msqid_ds | 0 | -1 |
msgsnd | 发送消息 | 0 | -1 |
msgrcv | 接受消息 | 消息数据部分的长度 | -1 |
信号量 | 不推荐使用,用记录锁代替 | ||
semget | 得到一个信号量 | 信号量队列ID | -1 |
semctl | 修改信号量的的semid_ds | 0 | -1 |
semop | 执行信号集合上的操做数字 | 0 | -1 |
共享存储 | |||
shmget | 建立一个共享存储 | 共享存储的ID | -1 |
shmctl | 修改共享存储的shmid_ds | 0 | -1 |
shmat | 链接一个共享存储的地址 | 指向共享存储段的指针 | -1 |
shmdt | 将共享存储的地址分离 | 0 | -1 |
unix域套接字 | |||
socketpair | 建立一个UNIX域套接字传输管道(相似于pipe) | 0 | -1 |
管道:shell
FIFO:服务器
XSI IPC:消息队列、信号量及共享存储器网络
IPC的标识符: 每一个内核中的IPC结构都用一个非负证书的标识符加以引用。dom
IPC的权限结构: XSI IPC为每一个IPC结构关联一个ipc_perm结构,规定了权限和全部者。socket
struct ipc_perm { uid_t uid; /*全部者(启动)userid*/ gid_t gid; /*全部者(启动)groupid*/ uid_t cuid; /*建立者userid*/ gid_t cgid; /*建立者userid*/ mode_t mode; /*访问模块*/ ... }
IPC的结构限制: 3种XSI IPC都有内核限制,能够经过从新配置内核来改变。函数
优势和缺点:oop
消息队列:消息队列是消息的连接表,存储在内核中,由消息队列标识符标识。测试
#include <unistd.h> int pipe(int fd[2]); -- '成功:0;出错:-1'
#include <stdio.h> FILE *popen(const char *cmdstring, const char *type); -- '成功:文件指针;出错:NULL' int pclose(FILE *fp); -- '成功:返回cmdstring的终止状态;出错:-1'
特色:ui
popen的功能:建立一个管道,fork一个子进程,关闭未使用的管道端,执行一个shell运行命令,而后等待命令终止。设计
popen先执行fork,而后调用exec执行cmdstring,而且返回一个标准I/O文件指针。
pclose:关闭标准I/O流,等待命令终止,而后返回shell的终止状态。
#include <sys/stat.h> int mkfifo(const char *path, mode_t mode); int mkfifoat(int fd, const char *path, mode_t mode); -- '成功:0;出错:-1'
参数:
特色:
用途:
#include <sys/ipc.h> key_t ftok(const char *path ,int id); -- '成功:返回键;出错:返回-1'
#include <sys/msg.h> int msgget(key_t key,int flag); -- '成功:返回消息队列ID;出错:-1' // msqid_ds结构 struct msqid_ds { struct icp_perm msg_perm; /*see Section 15.6.2*/ msgqnum_t msg_qnum; /* # of message on queue */ msglent_t msg_qbytes; /* max # of bytes on queue */ pid_t msg_lspid; /* pid of last msgsnd() */ pid_t msg_lrpid; /* pid of last msgrcv() */ time_t msg_stime; /* last-msgsnd() time */ time_t msg_rtime; /* last-msgrcv() time */ time_t msg_ctime; /* last-change time */ ... }
#include <sys/msg.h> int msgctl(int msqid, int cmd, struct msqid_ds *buf); -- '成功:0;出错:-1'
*参数:
参数 | 说明 |
---|---|
ICP_STAT | 取次队列的msqid_ds结构,并将它存放在buf指向的结构中 |
ICP_SET | 取次队列的msg_perm.uid,msg_perm.gid,msg_perm.mode和msg_qbytes从buf指向的结构复制到与这个队列相关的msqid_ds结构中。 |
ICP_RMID | 从系统中删除该消息对i额以及人在该队列中的全部数据。 |
#include <sys/msg.h> int msgsnd(int msqid, const void *ptr, size_t nbytes,int flag); --'成功:0;出错:-1' //ptr设计成以下 struct mymesg { long mtype; char mtext[512]; };
参数:
#include <sys/msg.h> ssize_t msgrcv(int msqid, void *ptr, size_t bytes, long type, int flag ); -- '成功:消息数据部分的长度;出错:-1'
参数:
做用:用于共享资源的同步。
信号量操做流程:
经常使用的信号量呗称为二元信号量(binary semaphore)。
缺点:
#include <sys/sem.h> int semget(key_t key, int nsems, int flag ); -- '成功:信号量ID;出错:-1'
#include <sys/sem.h> int semctl(int semid, int semnum,int cmd, ..../*uion semun arg */); -- '根据cmd返回'
#include <sys/sem.h> int semop(int semid, struct sembuf semoparray[], sieze_t nops); --'成功:0;出错:-1'
#include <sys/shm.h> int shmget(key_t key, size_t size, int flag); --'成功:共享存储的ID;出错:-1'
#include <sys/shm.h> int shmctl(int shmid, int cmd, struct shmids_ds *buf); -- '成功:0;出错:-1' // 共享存储的结构 struct shmid_ds { struct ipc_perm shm_perm; /*权限结构*/ size_t shm_setgsz; /*size of segment in bytes*/ pid_t shm_lpid; /*pid of last shmop()*/ pid_t shm_cpid; /*pid of creator*/ shmatt_t shm_nattch; /*number of current attaches*/ time_t shm_atime; /*last-attach time*/ time_t shm_dtime; /*last-detach time*/ time_t shm_ctime; /*last-change time*/ ... }
参数:
#include <sys/shm.h> void *shmat(int shmid, const void *addr, int flag); -- '成功:指向共享存储段的指针;出错:-1'
#include <sys/shm.h> int shmdt(const void *addr); -- '成功:0;出错:-1'
特色:
#include <sys/socket.h> int socketpari(int domain,int type, int protocol, int sockfd[2]); --'成功:0;出错:-1' //用例 int fd_pipe(int fd[2]) { return (socketpair(AF_UNIX, SOCK_STREAM,0,fd)); }