apue 第十五章 进程间通信
2015-08-02 14:28
465 查看
管道
int pipe(int fd[2]);
fd[0]是读端 fd[1]是写端
读一个写端已经关闭的pipe时read返回0
写一个读端已经关闭的pipe时产生信号SIGPIPE,如果该信号被忽略或者被捕捉从信号处理函数中返回时,wirite返回-1,errno设置为EPIPE
FILE *popen(const char *cmdstring,const char *type )
int pclose(File *fp)
调用popen先执行fork,子进程exec执行cmdstring(sh -c cmdstring)
type="w" pro | cmdstring
type="r" cmdstring | pro
FIFO命名管道
int mkfifo(const char *path,mode_t mode);
创建fifo,mode与open中的mode相同
创建成功后,使用open去打开fifo文件,在未指定O_NONBLOCK的情况下,只读open会阻塞到直到有一个进程已写方式打开该fifo,类似的,只写open会阻塞到有一个进程读open该fifo
XSI IPC
每个IPC结构都有一个标识符(key_t key)
每个IPC关联了一个ipc_perm结构
struct ipc_perm
{
uid_t uid;
gid_t gid;
uid_t cuid;//有效用户ID
gid_t cgid;//有效组ID
mode_t mode;//access mode
};(至少定义了以上成员)
消息队列
struct msqid_ds
{
struct ipc_perm msg_perm;
msgqnum_t msg_qnum ;//队列中消息的数量
msglen_t msg_qbytes;
pid_t msg_lspid;//pid of last send
pid_t msg_lrpid;//pid of last receive
time_t msg_stime;//time of last send
time_t msg_rtime;//time of last receive
time_t msg_ctime;//time of last change
};
int msgget(key_t key,int flag)
返回消息队列的ID(msqid),初始化消息队列的msqid_ds:
1、初始化ipc_perm结构,msg_perm.mode设置为flag(用户、组、其他的读写权限,对于信号量,写是指更改)
2、msg_ctime设置为当前时间,msg_qbytes设置为系统限制,其他设置为0
int msgctl(int msqid,int cmd,struct msqid_ds *buf);
对于cmd:
IPC_STAT:获取消息队列的msqid_ds,保存在buf中
IPC_SET:设置消息队列的msqid_ds,将msg_perm.uid、msg_perm.gid、msg_perm.mode 和qbytes设置为buf中的对应成员,只有由进程有效用户ID为消息队列的用户ID或者有效用户ID的进程执行,或者由超级用户执行。
IPC_RMID:删除消息队列,立即生效,如再有进程试图访问将得到EIDRM错误,权限同上
int msgsend(int msqid,const void *ptr,size_t nbytes,int flag)
ptr是指向长整型的指针,如下面的结构
struct mymesg
{
long mtype;
char metext[];
};
flag:IPC_NOWAIT,非阻塞,若消息队列已满,则返回EAGAIN,如果没有指定IPC_NOWAIT,则会阻塞到有足够的空间可以容纳要发送的消息
ssize_t msgrcv(int msqid,void *ptr,size_t nbytes,long type,int flag)
flag:若指定了MSG_NOERROR,当队列中消息长度超过nbytes时,消息被截断,多余的部分被丢弃
若没有指定,则出错返回E2BIG,消息扔留在队列中
flag还可以指定为IPC_NOWAIT,非阻塞
type:
type==0,返回消息队列中的第一个消息
type>0返回队列中消息类型为type的第一个消息(消息类型在mymesg中指定的)
type<0返回消息类型小于等于type绝对值的消息,如果有多个消息符合,则返回消息类型值最小的消息
int pipe(int fd[2]);
fd[0]是读端 fd[1]是写端
读一个写端已经关闭的pipe时read返回0
写一个读端已经关闭的pipe时产生信号SIGPIPE,如果该信号被忽略或者被捕捉从信号处理函数中返回时,wirite返回-1,errno设置为EPIPE
FILE *popen(const char *cmdstring,const char *type )
int pclose(File *fp)
调用popen先执行fork,子进程exec执行cmdstring(sh -c cmdstring)
type="w" pro | cmdstring
type="r" cmdstring | pro
FIFO命名管道
int mkfifo(const char *path,mode_t mode);
创建fifo,mode与open中的mode相同
创建成功后,使用open去打开fifo文件,在未指定O_NONBLOCK的情况下,只读open会阻塞到直到有一个进程已写方式打开该fifo,类似的,只写open会阻塞到有一个进程读open该fifo
XSI IPC
每个IPC结构都有一个标识符(key_t key)
每个IPC关联了一个ipc_perm结构
struct ipc_perm
{
uid_t uid;
gid_t gid;
uid_t cuid;//有效用户ID
gid_t cgid;//有效组ID
mode_t mode;//access mode
};(至少定义了以上成员)
消息队列
struct msqid_ds
{
struct ipc_perm msg_perm;
msgqnum_t msg_qnum ;//队列中消息的数量
msglen_t msg_qbytes;
pid_t msg_lspid;//pid of last send
pid_t msg_lrpid;//pid of last receive
time_t msg_stime;//time of last send
time_t msg_rtime;//time of last receive
time_t msg_ctime;//time of last change
};
int msgget(key_t key,int flag)
返回消息队列的ID(msqid),初始化消息队列的msqid_ds:
1、初始化ipc_perm结构,msg_perm.mode设置为flag(用户、组、其他的读写权限,对于信号量,写是指更改)
2、msg_ctime设置为当前时间,msg_qbytes设置为系统限制,其他设置为0
int msgctl(int msqid,int cmd,struct msqid_ds *buf);
对于cmd:
IPC_STAT:获取消息队列的msqid_ds,保存在buf中
IPC_SET:设置消息队列的msqid_ds,将msg_perm.uid、msg_perm.gid、msg_perm.mode 和qbytes设置为buf中的对应成员,只有由进程有效用户ID为消息队列的用户ID或者有效用户ID的进程执行,或者由超级用户执行。
IPC_RMID:删除消息队列,立即生效,如再有进程试图访问将得到EIDRM错误,权限同上
int msgsend(int msqid,const void *ptr,size_t nbytes,int flag)
ptr是指向长整型的指针,如下面的结构
struct mymesg
{
long mtype;
char metext[];
};
flag:IPC_NOWAIT,非阻塞,若消息队列已满,则返回EAGAIN,如果没有指定IPC_NOWAIT,则会阻塞到有足够的空间可以容纳要发送的消息
ssize_t msgrcv(int msqid,void *ptr,size_t nbytes,long type,int flag)
flag:若指定了MSG_NOERROR,当队列中消息长度超过nbytes时,消息被截断,多余的部分被丢弃
若没有指定,则出错返回E2BIG,消息扔留在队列中
flag还可以指定为IPC_NOWAIT,非阻塞
type:
type==0,返回消息队列中的第一个消息
type>0返回队列中消息类型为type的第一个消息(消息类型在mymesg中指定的)
type<0返回消息类型小于等于type绝对值的消息,如果有多个消息符合,则返回消息类型值最小的消息
相关文章推荐
- UILabel字体加粗 IOS
- leetcode 60: Permutation Sequence
- Common Subsequence(最长公共子序列DP)
- 调整UILabel行高间距
- codeforces 566F F. Clique in the Divisibility Graph(dp)
- 常用类库StringBuilder
- 【LeetCode】232 & 225 - Implement Queue using Stacks & Implement Stack using Queues
- 在iOS 8中使用UIAlertController
- 【转】UITableView使用详解
- 洛谷1373 小a和uim之大逃离
- easyui dataGrid接收嵌套JSON
- easyui dialog子窗口关闭父窗口
- android:layout_centerHorizontal="true"和 android:gravity="center_horizontal"什么区别?
- Selenium2学习-026-WebUI自动化实战实例-024-获取页面元素
- uuid (guid)全局唯一标识符
- Android SDK Tools Platform-tools Build-tools
- hdu 5329 Question for the Leader 枚举,划分图为k个联通的子图
- Gym 100570E : Palindrome Query
- IOS开发之UIScrollViewDelegate详解
- iOS 人机交互设计(开发)指南及一些综合知识整合