有名管道的创建:
#include <sys/types.h>
#include <sys/stat.h>
int mkfifo(const char * pathname, mode_t mode)
该函数的第一个参数是一个普通的路径名,也就是创建后FIFO的名字。
第二个参数与打开普通文件的open()函数中的mode参数相同。
如果mkfifo的第一个参数是一个已经存在的路径名时,会返回EEXIST错误,所以一般典型的调用代码首先会检查是否返回该错误,如果确实返回该错误,那么只要调用打开FIFO的函数就可以了。一般文件的I/O函数都可以用于FIFO,如close、read、write等等。
有名管道比管道多了一个打开操作:open。
FIFO的打开规则:
如果当前打开操作是为读而打开FIFO时,若已经有相应进程为写而打开该FIFO,则当前打开操作将成功返回;否则,可能阻塞直到有相应进程为写而打开该FIFO(当前打开操作设置了阻塞标志);或者,成功返回(当前打开操作没有设置阻塞标志)。
如果当前打开操作是为写而打开FIFO时,如果已经有相应进程为读而打开该FIFO,则当前打开操作将成功返回;否则,可能阻塞直到有相应进程为读而打开该FIFO(当前打开操作设置了阻塞标志);或者,返回ENXIO错误(当前打开操作没有设置阻塞标志)。
msgsnd函数原型
msgsnd (将消息写入到消息队列) |
||||||||||||||||||||||||||||||||||||||
所需头文件 |
#include <sys/types.h> #include <sys/ipc.h> #include <sys/msg.h> |
|||||||||||||||||||||||||||||||||||||
函数说明 |
将msgp消息写入到标识符为msqid的消息队列 |
|||||||||||||||||||||||||||||||||||||
函数原型 |
int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg) |
|||||||||||||||||||||||||||||||||||||
函数传入值 |
msqid |
消息队列标识符 |
||||||||||||||||||||||||||||||||||||
msgp |
发送给队列的消息。msgp可以是任何类型的结构体,但第一个字段必须为long类型,即表明此发送消息的类型,msgrcv根据此接收消息。msgp定义的参照格式如下: struct s_msg{ /*msgp定义的参照格式*/ |
|||||||||||||||||||||||||||||||||||||
msgsz |
要发送消息的大小,不含消息类型占用的4个字节,即mtext的长度 |
|||||||||||||||||||||||||||||||||||||
msgflg |
0:当消息队列满时,msgsnd将会阻塞,直到消息能写进消息队列 |
|||||||||||||||||||||||||||||||||||||
IPC_NOWAIT:当消息队列已满的时候,msgsnd函数不等待立即返回 |
||||||||||||||||||||||||||||||||||||||
IPC_NOERROR:若发送的消息大于size字节,则把该消息截断,截断部分将被丢弃,且不通知发送进程。 |
||||||||||||||||||||||||||||||||||||||
函数返回值 |
成功:0 |
|||||||||||||||||||||||||||||||||||||
出错:-1,错误原因存于error中 |
||||||||||||||||||||||||||||||||||||||
错误代码 |
EAGAIN:参数msgflg设为IPC_NOWAIT,而消息队列已满 EIDRM:标识符为msqid的消息队列已被删除 EACCESS:无权限写入消息队列 EFAULT:参数msgp指向无效的内存地址 EINTR:队列已满而处于等待情况下被信号中断 EINVAL:无效的参数msqid、msgsz或参数消息类型type小于0 msgrcv函数原型
msgrcv()解除阻塞的条件有以下三个: ① 消息队列中有了满足条件的消息。 ② msqid代表的消息队列被删除。 ③ 调用msgrcv()的进程被信号中断。 |