精华内容
下载资源
问答
  • 消息队列-msgctl

    2020-09-24 11:19:27
    msgctl-系统V消息控制操作 头文件 #include <sys / types.h> #include <sys / ipc.h> #include <sys / msg.h> 函数 int msgctl(int msqid ,int cmd ,struct msqid_ds * buf );控制消息队列 ...

    msgctl-系统V消息控制操作

    头文件

    #include <sys / types.h>
    #include <sys / ipc.h>
    #include <sys / msg.h>

    函数

       int msgctl(int msqid ,int cmd ,struct msqid_ds * buf );控制消息队列
    

    第一个参数msgqid 是消息队列对象的标识符。

    所述的msqid_ds数据结构定义在在<sys / msg.h>如下:

    struct msqid_ds {
               struct ipc_perm msg_perm; / *所有权和权限* /
               time_t msg_stime; / *最后一次msgsnd(2)的时间* /
               time_t msg_rtime; / *最后一次msgrcv(2)的时间* /
               time_t msg_ctime; / *创建时间/最后时间
                                                通过msgctl()修改* /
               无符号长__msg_cbytes;/ *当前的字节数
                                                队列(非标准)* /
               msgqnum_t msg_qnum; / *当前消息数
                                                在队列中* /
               msglen_t msg_qbytes; / *最大字节数
                                                队列中允许* /
               pid_t msg_lspid; / *最后一个msgsnd(2)的PID * /
               pid_t msg_lrpid; / *最后一个msgrcv(2)的PID * /
           };
    

    msgid_ds结构的字段如下:

           msg_perm    这是一个ipc_perm结构(请参见下文),用于指定消息队列上的访问权限。
    
           msg_qnum    当前在消息队列上的消息数。
    
           msg_qbytes邮件文本上允许的最大字节数消息队列。
    
           msg_lspid   执行最后一个msgsnd(2)系统的进程的ID呼叫。
    
           msg_lrpid   执行最后一个msgrcv(2)系统的进程的ID呼叫。
    
           msg_stime   上一次msgsnd(2)系统调用的时间。
    
           msg_rtime   上一次msgrcv(2)系统调用的时间。
    
           msg_ctime   创建队列的时间或上一个msgctl()IPC_SET的时间操作。
    
       所述的ipc_perm结构定义如下(突出显示的字段可使用IPC_SET设置):
    
    struct ipc_perm {
               key_t __key; / *提供给msgget(2)的密钥* /
               uid_t           uid ; / *所有者的有效UID * /
               gid_t           gid ; / *所有者的有效GID * /
               uid_t cuid; / *创建者的有效UID * /
               gid_t cgid; / *创建者的有效GID * /
               无符号短模式 ; / *权限* /
               无符号的短__seq; /* 序列号 */
           };
    

    第二个参数是函数要对消息队列进行的操作,它可以是:

    	IPC_STAT:取出系统保存的消息队列的msqid_ds 数据,并将其存入参数buf 指向的msqid_ds 结构中。
    
    	IPC_SET:设定消息队列的msqid_ds 数据中的msg_perm 成员。设定的值由buf 指向的msqid_ds结构给出。
    
    	IPC_EMID:将队列从系统内核中删除
    	IPC_INFO(特定于Linux)
              返回有关系统范围内消息队列限制的信息,以及buf指向 的结构中的参数。这种结构如果定义了_GNU_SOURCE功能测试宏,则其类型为msginfo(因此需要强制转换),在
               <sys / msg.h>中定义:
    
                  struct msginfo {
    
                      int msgpool; / *缓冲池的大小(以千字节为单位) 用于保存消息数据;在内核中未使用* /
                      
                      int msgmap; / *消息中的最大条目数地图; 在内核中未使用* /
                      int msgmax; / *可以使用的最大字节数写在单个消息中* /
                      int msgmnb; / *可以使用的最大字节数写入队列;用于初始化队列创建过程中的单位msg_qbytes(msgget(2))* /
                      int msgmni; / *消息队列的最大数量* /
                      int msgssz; / *消息段大小;在内核中未使用* /
                      int msgtql; / *所有队列上的最大消息数在系统中 在内核中未使用* /
                       unsigned short int msgseg; / *最大段数;在内核中未使用* /
                  };
    

    MSG_INFO (Linux-specific)

       MSG_STAT (Linux-specific)
            
       MSG_STAT_ANY (Linux-specific, since Linux 4.17)
    

    返回值

       成功时,IPC_STAT,IPC_SET和IPC_RMID返回0。成功的IPC_INFO或MSG_INFO操作返回内核内部阵列中使用最高的条目的索引,该索引记录有关所有 消息队列的信息。(此信息可以与重复的MSG_STAT 或MSG_STAT_ANY操作一起使用,以获取有关系统上所有队列的信息。)成功的MSG_STAT或MSG_STAT_ANY操作将返回其索引在msqid中给出的队列的标识符。
    
       发生错误时,返回-1,并带有errno表示错误。
    
    展开全文
  • msgctl()函数

    千次阅读 2018-08-01 16:37:25
    通过msgctl()函数,我们可以直接控制消息队列的行为。它在系统库linux/msg.h 中的 定义是这样的: 系统调用: msgctl() 函数声明: int msgctl ( int msgqid, int cmd, struct msqid_ds *buf ) 返回值: 0 on ...

    原文链接:链接

    通过msgctl()函数,我们可以直接控制消息队列的行为。它在系统库linux/msg.h 中的
    定义是这样的:
    系统调用: msgctl()
    函数声明: int msgctl ( int msgqid, int cmd, struct msqid_ds *buf )
    返回值: 0 on success
    -1 on error: errno = EACCES (No read permission and cmd is IPC_STAT)
    EFAULT (Address pointed to by buf is invalid with
    IPC_SET and IPC_STAT commands)
    EIDRM (Queue was removed during retrieval)
    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 是消息队列对象的标识符。
    第二个参数是函数要对消息队列进行的操作,它可以是:
    IPC_STAT
    取出系统保存的消息队列的msqid_ds 数据,并将其存入参数buf 指向的msqid_ds 结构
    中。
    IPC_SET
    设定消息队列的msqid_ds 数据中的msg_perm 成员。设定的值由buf 指向的msqid_ds
    结构给出。
    IPC_EMID
    将队列从系统内核中删除。
    这三个命令的功能都是明显的,所以就不多解释了。唯一需要强调的是在IPC_STAT
    命令中队列的msqid_ds 数据中唯一能被设定的只有msg_perm 成员,其是ipc_perm 类型的
    数据。而ipc_perm 中能被修改的只有mode,pid 和uid 成员。其他的都是只能由系统来设定
    的。
    最后我们将使用msgctl()函数来开发几个封装函数作为本节的例子:
    IPC_STAT 的例子:
    int get_queue_ds( int qid, struct msgqid_ds *qbuf )
    {
    if( msgctl( qid, IPC_STAT, qbuf) == -1)
    {
    return(-1);
    }
    return(0);
    }
    IPC_SET 的例子:
    int change_queue_mode( int qid, char *mode )
    {
    struct msqid_ds tmpbuf;
    /* Retrieve a current copy of the internal data structure */
    get_queue_ds( qid, &tmpbuf);
    /* Change the permissions using an old trick */
    sscanf(mode, "%ho", &tmpbuf.msg_perm.mode);
    /* Update the internal data structure */
    if( msgctl( qid, IPC_SET, &tmpbuf) == -1)
    {
    return(-1);
    }
    return(0);
    }
    IPC_RMID 的例子:
    int remove_queue( int qid )
    {
    if( msgctl( qid, IPC_RMID, 0) == -1)
    {
    return(-1);
    }
    return(0);
    }

    展开全文
  • 消息队列函数实例代码及相关教程 包括msgget、msgctl、msgsnd、msgrcv
  • /*msgctl函数创建消息队列*/ //第一个参数为消息队列的标示符msgid //第二个参数为执行动作,,,IPC_RMID //第三个为消息队列结构体 #include &lt;unistd.h&gt; #include &lt;sys/types.h&gt; #...
    /*msgctl函数创建消息队列*/
    //第一个参数为消息队列的标示符msgid
    //第二个参数为执行动作,,,IPC_RMID
    //第三个为消息队列结构体
    #include <unistd.h>
    #include <sys/types.h>
    #include <sys/ipc.h>
    #include <sys/msg.h>
    
    #include <stdlib.h>
    #include <stdio.h>
    #include <errno.h>
    
    #define ERR_EXIT(m)
    		do \
    		{           \
    			perror(m); \
    			exit(EXIT_FAILURE); \
    		}while(0) 
    
    int main(void)
    {
    	int msgid;
    	msgid = msgget(1234, 0666 | IPC_CREAT | IPC_EXCL);
    	msgid = msgget(1234, 0);//0可以打开任何权限的消息队列,只打开不创建
    
    
    
    	if(msgid == -1)
    	{
    		ERR_EXIT("msgget");
    	}
    
    	printf("msgget success\n");
    	//msgctl(msgid, IPC_RMID, NULL);//删除当前打开的消息队列
    
    	struct msgid_ds buf;//消息队列结构体
    	msgctl(msgid, IPC_STAT, &buf);//获取消息队列结构体中的内容
    	printf("mode = %o\n", buf.msg_perm.mode);
    
    	sscanf("600", "%o", (unsigned int*)&buf.msg_perm.mode);
    	msgctl(msgid, IPC_SET, &buf)//先获取结构体,再修改其内容
    	return 0;
    }
    
    展开全文
  • msgctl()函数 .

    千次阅读 2013-11-21 11:00:26
    通过msgctl()函数,我们可以直接控制消息队列的行为。它在系统库linux/msg.h 中的 定义是这样的: 系统调用: msgctl() 函数声明: int msgctl ( int msgqid, int cmd, struct msqid_ds *buf ) 返回值: 0 on ...
     通过msgctl()函数,我们可以直接控制消息队列的行为。它在系统库linux/msg.h 中的
    定义是这样的:
    系统调用: msgctl()
    函数声明: int msgctl ( int msgqid, int cmd, struct msqid_ds *buf )
    返回值: 0 on success
    -1 on error: errno = EACCES (No read permission and cmd is IPC_STAT)
    EFAULT (Address pointed to by buf is invalid with
    IPC_SET and IPC_STAT commands)
    EIDRM (Queue was removed during retrieval)
    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 是消息队列对象的标识符。
    第二个参数是函数要对消息队列进行的操作,它可以是:
    IPC_STAT
    取出系统保存的消息队列的msqid_ds 数据,并将其存入参数buf 指向的msqid_ds 结构
    中。
    IPC_SET
    设定消息队列的msqid_ds 数据中的msg_perm 成员。设定的值由buf 指向的msqid_ds
    结构给出。
    IPC_RMID
    将队列从系统内核中删除。
    这三个命令的功能都是明显的,所以就不多解释了。唯一需要强调的是在IPC_STAT
    命令中队列的msqid_ds 数据中唯一能被设定的只有msg_perm 成员,其是ipc_perm 类型的
    数据。而ipc_perm 中能被修改的只有mode,pid 和uid 成员。其他的都是只能由系统来设定
    的。
    最后我们将使用msgctl()函数来开发几个封装函数作为本节的例子:
    IPC_STAT 的例子:
    int get_queue_ds( int qid, struct msgqid_ds *qbuf )
    {
    if( msgctl( qid, IPC_STAT, qbuf) == -1)
    {
    return(-1);
    }
    return(0);
    }
    IPC_SET 的例子:
    int change_queue_mode( int qid, char *mode )
    {
    struct msqid_ds tmpbuf;
    /* Retrieve a current copy of the internal data structure */
    get_queue_ds( qid, &tmpbuf);
    /* Change the permissions using an old trick */
    sscanf(mode, "%ho", &tmpbuf.msg_perm.mode);
    /* Update the internal data structure */
    if( msgctl( qid, IPC_SET, &tmpbuf) == -1)
    {
    return(-1);
    }
    return(0);
    }
    IPC_RMID 的例子:
    int remove_queue( int qid )
    {
    if( msgctl( qid, IPC_RMID, 0) == -1)
    {
    return(-1);
    }
    return(0);
    }
    展开全文
  • 消息队列函数由msgget、msgctl、msgsnd、msgrcv四个函数组成。下面的表格列出了这四个函数的函数原型及其具体说明。1. &amp;nbsp; msgget函数原型msgget(得到消息队列标识符或创建一个消息队列对象)所需头文件#...
  • 消息队列特性 消息队列存在于Linux内核中,可以使数据双向流动...msgctl——控制消息队列 一、msgget——创建一个消息队列 1.原函数 表头文件 #include <sys/types.h> #include <sys/ipc.h> #include <
  • 通过msgctl()函数,我们可以直接控制消息队列的行为 头文件 #include <sys/types.h> #include <sys/ipc.h> #include <sys/msg.h> 函数原型 int msgctl(int msqid,int cmd,struct msqid_ds...
  • 消息队列的属性保存在系统维护的数据结构msqid_ds中,用户可以通过函数msgctl获取或设置消息队列的属性。 int msgctl(int msqid, int cmd, struct msqid_ds *buf); msgctl:系统调用对msgqid标识的消息队列执行cmd...
  • 消息队列函数由msgget、msgctl、msgsnd、msgrcv四个函数组成。下面的表格列出了这四个函数的函数原型及其具体说明。 1. msgget函数原型 msgget(得到消息队列标识符或创建一个消息队列对象) 所需...
  • 消息队列之msgctl()

    2013-01-15 13:35:00
    #include<sys/types.h> #include<...int msgctl (int msqid, int cmd, struct msqid_ds *buf); //消息队列属性控制 参数: msqid:消息队列的标识符。 cmd:执行的控制命令,即要执行...
  • System V IPC 机制:消息队列消息队列函数 msgget()msgget.c函数msgsnd()和函数msgrcv()msgget_msgsnd.cmsgget_msgrcv.cmsgget_msgrcv_nowait.c函数msgctl()msgget_msgctl.c 消息队列 消息队列与 FIFO 很相似,都是...
  • msgctl函数

    2012-09-18 17:20:58
    //struct msqid_ds是系统定义的结构体可以 man msgctl 查看  key_t key;  int msgqid, ret;  MSG msg;  pid_t pid;  long chr;  char buf[100];  strcpy(msg.name,"Lucy");  //IPC_RMID();...
  • Linux进程间通信:消息队列 msgget()、msgsend()、msgrcv()、msgctl()
  • 消息队列函数(msgget、msgctl、msgsnd、msgrcv)及其范例 分类: Linux进程间通信 2011-07-04 17:29 6366人阅读 评论(4) 收藏 举报 structsystemcmdgcclinux编程 目录(?)[+] msgget函数原型...
  • 消息队列函数由msgget、msgctl、msgsnd、msgrcv四个函数组成。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 6,372
精华内容 2,548
关键字:

msgctl