函數 | 說明 | 成功 | 失敗 |
---|---|---|---|
管道和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)); }