请看下面的简单的服务程序进程: #include<stdio.h> #include<stdlib.h> #include<sys/stat.h> #include<unistd.h> #include<linux/stat.h> #defineFIFO_FILE"MYFIFO" intmain(void) { FILE*fp; charreadbuf[80]; /*CreatetheFIFOifitdoesnotexist*/ umask(0); mknod(FIFO_FILE,S_IFIFO0666,0); while(1) { fp=fopen(FIFO_FILE,"r"); fgets(readbuf,80,fp); printf("Receivedstring:%s ",readbuf); fclose(fp); return(0); 因为FIFO管道缺省时有阻塞的函数,所以你可以在后台运行此程序: $fifoserver& 再来看一下下面的简单的客户端程序: #include<stdio.h> #include<stdlib.h> #defineFIFO_FILE"MYFIFO" intmain(int argc,char* argv[]) { FILE*fp; if(argc!=2){ printf("USAGE:fifoclient[string] "); exit(1); } if((fp=fopen(FIFO_FILE,"w"))==NULL){ perror("fopen"); exit(1); } fputs(argv[1],fp); fclose(fp); return(0); }
[目录]
--------------------------------------------------------------------------------
阻塞FIFO
一般情况下,FIFO管道上将会有阻塞的情况发生。也就是说,如果一个FIFO管道打开供读取的话,它将一直阻塞,直到其他的进程打开管道写入信息。这种过程反过来也一样。如果你不需要阻塞函数的话,你可以在系统调用open()中设置O_NONBLOCK标志,这样可以取消缺省的阻塞函数。
[目录]
--------------------------------------------------------------------------------
消息队列
在UNIX的SystemV版本,AT&T引进了三种新形式的IPC功能(消息队列、信号量、以及共享内存)。但BSD版本的UNIX使用套接口作为主要的IPC形式。linux系统同时支持这两个版本。
[目录]
--------------------------------------------------------------------------------
msgget()
系统调用msgget() 如果希望创建一个新的消息队列,或者希望存取一个已经存在的消息队列,你可以使用系统调用msgget()。
系统调用:msgget(); 原型:intmsgget(key_t key,int msgflg); 返回值:如果成功,返回消息队列标识符 如果失败,则返回-1:errno=EAccess(权限不允许) EEXIST(队列已经存在,无法创建) EIDRM(队列标志为删除) ENOENT(队列不存在) ENOMEM(创建队列时内存不够) ENOSPC(超出最大队列限制)
系统调用msgget()中的第一个参数是关键字值(通常是由ftok()返回的)。然后此关键字值将会和其他已经存在于系统内核中的关键字值比较。这时,打开和存取操作是和参数msgflg中的内容相关的。 IPC_CREAT如果内核中没有此队列,则创建它。 IPC_EXCL当和IPC_CREAT一起使用时,如果队列已经存在,则失败。
如果单独使用IPC_CREAT,则msgget()要么返回一个新创建的消息队列的标识符,要么返回具有相同关键字值的队列的标识符。如果IPC_EXCL和IPC_CREAT一起使用,则msgget()要么创建一个新的消息队列,要么如果队列已经存在则返回一个失败值-1。IPC_EXCL单独使用是没有用处的。 下面看一个打开和创建一个消息队列的例子: intopen_queue(key_t keyval) { intqid; if((qid=msgget(keyval,IPC_CREAT0660))==-1) { return(-1); } return(qid); }
[目录]
--------------------------------------------------------------------------------
msgsnd()
系统调用msgsnd() 一旦我们得到了队列标识符,我们就可以在队列上执行我们希望的操作了。如果想要往队列中发送一条消息,你可以使用系统调用msgsnd():
系统调用:msgsnd(); 原型:intmsgsnd(int msqid,strUCt msgbuf*msgp,int msgsz,int msgflg); 返回值:如果成功,0。 如果失败,-1:errno=EAGAIN(队列已满,并且使用了IPC_NOWAIT) EACCES(没有写的权限) EFAULT(msgp地址无效) EIDRM(消息队列已经删除) EINTR(当等待写操作时,收到一个信号) EINVAL(无效的消息队列标识符,非正数的消息类型,或 者无效的消息长度) ENOMEM(没有足够的内存复制消息缓冲区)
上一篇:如何实现大图标风格的打开对话框
下一篇:ar和nm命令的使用
|