apue 第十五章 进程间通信

管道

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绝对值的消息,如果有多个消息符合,则返回消息类型值最小的消息




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值