}//消息发送后输出消息队列的属性showmsgattr(qid, msgattr);//设置消息队列的属性msgattr.msg_perm.uid =33; msgctl(qid, IPC_SET,&msgattr);//设置属性后输出消息队列的属性showmsgattr(qid, msgattr);//删除后再输出消息队列的属性msgctl(qid, IPC_RMID, NULL); showmsgattr(qid, msgattr);return0;...
IPC_RMID:删除消息队列。 IPC_INFO:读取消息队列基本情况。此命令等同于 ipcs 命令。 这4 条命令(IPC_STAT、IPC_SET、IPC_INFO 和 IPC_RMID)也可用于信号量和共享存储。 buf:临时的 msqid_ds 结构体类型的变量。用于存储读取的消息队列属性或需要修改的消息队列属性。 举例:msgctl(qid, IPC_RMID, NULL) //...
#include<stdlib.h>#include<stdio.h>#include<sys/types.h>#include<sys/ipc.h>#include<sys/msg.h>intmain(intargc,char*argv[]){intqid;intret;if(argc<2){printf("请输入正确的键值\n");exit(0);}qid=atoi(argv[1]);//获取键值ret=msgctl(qid,IPC_RMID,NULL);//删除消息队列if(ret<0){pr...
和IPC_EXCL标志ENOENT:key指定的消息队列不存在同时msgflg中没有指定IPC_CREAT标志ENOMEM:需要建立消息队列,但内存不足ENOSPC:需要建立消息队列,但已达到系统的限制如果用msgget创建了一个新的消息队列对象时,则msqid_ds结构成员变量的值设置如下: msg_qnum、msg_lspid、msg_lrpid、 msg_stime、msg_rtime设置为0...
&tmpbuf);/*Changethepermissionsusinganoldtrick*/sscanf(mode,"%ho",&tmpbuf.msg_perm.mode);/*Updatetheinternaldatastructure*/if(msgctl(qid,IPC_SET,&tmpbuf)==-1){return(-1);}return(0);}IPC_RMID的例子:intremove_queue(intqid){if(msgctl(qid,IPC_RMID,0)==-1){return(-1);}return(0...
EINVAL (msgqid invalid, or msgsz less than 0) EPERM (IPC_SET or IPC_RMID command was issued, but calling process does not have write (alter) access to the queue) 函数的第一个参数msgqid 是消息队列对象的标识符。 第二个参数是函数要对消息队列进行的操作,它可以是: ...
调用原型: int msgctl ( int msgqid, int cmd, struct msqid_ds *buf ); 返回值: 0 ,如果成功。 - 1,如果失败:errno = EACCES (没有读的权限同时cmd 是IPC_STAT ) EFAULT (buf 指向的地址无效) EIDRM (在读取中队列被删除) EINVAL (msgqid无效, 或者msgsz 小于0 ) ...
int msgctl ( i财查站本nt msgqid, int cmd, struct msqid_ds *buf); 折叠头文件: #include <sys/types.h> #include <sys/ipc.h> #整专宜具刘措include <sys/msg.h> 折叠返回值: 0 ,如果成功。 - 1,如果失败:errno = EACCES (没有读的权限同时cmd 是IPC_STAT ) ...
然后,我们调用sscanf( )修改数据结构msg_perm中的mode 成员的值。但直到调用msgctl()时,权限的改变才真正完成。在这里msgctl()使用的是IPC_SET命令。 最后,我们使用系统调用msgctl ( )中的IPC_RMID命令删除消息队列: int remove_queue(int qid ) { if( msgctl( qid, IPC_RMID, 0) == -1) { return(-1...