您的位置:首页 > 产品设计 > UI/UE

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绝对值的消息,如果有多个消息符合,则返回消息类型值最小的消息
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: