当前位置:  技术问答>linux和unix

位运算的问题。

    来源: 互联网  发布时间:2016-03-16

    本文导语:  #include  #include  #include  #include  int main(void) { key_t key; int msqid; int proj_id; key=IPC_PRIVATE; msqid=msgget(key,0777); if(msqid==-1) perror("cannot create message queue"); else printf("1. key=IPC_PRIVATE, message queue msqid= %dn",msqid); p...

#include 
#include 
#include 
#include 

int main(void)
{
key_t key;
int msqid;
int proj_id;

key=IPC_PRIVATE;
msqid=msgget(key,0777);
if(msqid==-1)
perror("cannot create message queue");
else
printf("1. key=IPC_PRIVATE, message queue msqid= %dn",msqid);

proj_id=1;
key=ftok("/home/program",proj_id);
if(key==-1)
perror("cannot generate messge queue key");

msqid=msgget(key,IPC_CREAT|0777);
        if(msqid==-1)
                perror("cannot create message queue");
else
         printf("2. key=%d generated by ftok, message queue msqid= %dn",key,msqid);

msqid=msgget(key,IPC_CREAT |IPC_EXCL |0777);
if(msqid==-1)
perror("cannot create message queue");

msqid=msgget(key,IPC_CREAT |0777);
if(msqid==-1)
perror("cannot create message queue");
else
printf("Access the existing message queuen");

return 0;
}

-------------------------
msqid=msgget(key,IPC_CREAT |IPC_EXCL |0777);
这里的IPC_CREAT |IPC_EXCL |0777是什么意思?为什么都要用位运算连接起来?

|
对楼主的程序
IPC_CREAT表示如果消息队列不存在就新建.
IPC_CREAT|IPC_EXCL表示建立新消息队列, 如果消息队列已经存在, 返回错误EEXIST.
0777表示消息队列的访问模式为. 

用位或运算连接起来是为了把这些信息放在一个参数msgflg里.

看一下下面的定义, 可以注意到以下的宏IPC_CREAT等等, 只有一位二进制位是1, 就应该能理解了.

#define IPC_CREAT       001000  /* create entry if key does not exist */
#define IPC_EXCL        002000  /* fail if key exists */
#define IPC_NOWAIT      004000  /* error if request must wait */

#define S_IRUSR 0000400                 /* R for owner */
#define S_IWUSR 0000200                 /* W for owner */
#define S_IXUSR 0000100                 /* X for owner */

#define S_IRGRP 0000040                 /* R for group */
#define S_IWGRP 0000020                 /* W for group */
#define S_IXGRP 0000010                 /* X for group */

#define S_IROTH 0000004                 /* R for other */
#define S_IWOTH 0000002                 /* W for other */
#define S_IXOTH 0000001                 /* X for other */

|
man msgget
[code=BatchFile]
msgget(2)  System Calls      msgget(2)

NAME
       msgget - get message queue

SYNOPSIS
       #include 

       int msgget(key_t key, int msgflg);

DESCRIPTION
       The  msgget()  argument returns the message queue identifier associated
       with key.

       A message queue identifier and associated message queue and data struc-
       ture  (see  intro(2))  are  created for key if one of the following are
       true:

  o  key is IPC_PRIVATE.

  o  key does not already have a message queue identifier  associated
     with it, and (msgflg&IPC_CREAT) is true.

       On  creation,  the data structure associated with the new message queue
       identifier is initialized as follows:

  o  msg_perm.cuid, msg_perm.uid, msg_perm.cgid, and msg_perm.gid  are
     set  to  the  effective  user  ID and effective group ID, respec-
     tively, of the calling process.

  o  The low-order 9 bits of msg_perm.mode are set to the low-order  9
     bits of msgflg.

  o  msg_qnum, msg_lspid, msg_lrpid, msg_stime, and msg_rtime are set
     to 0.

  o  msg_ctime is set to the current time.

  o  msg_qbytes is set to the system limit.

RETURN VALUES
       Upon successful completion, a non-negative integer representing a  mes-
       sage  queue identifier is returned. Otherwise, -1 is returned and errno
       is set to indicate the error.

ERRORS
       The msgget() function will fail if:

       EACCES
     A message queue identifier exists for key, but operation  permis-
     sion  (see  intro(2))  as specified  by  the low-order 9 bits of
     msgflg would not be granted.

       EEXIST
     A message queue identifier exists for key but  (msgflg&IPC_CREAT)
     and (msgflg&IPC_EXCL) are both true.

       ENOENT
     A  message   queue   identifier  does  not  exist  for  key  and
     (msgflg&IPC_CREAT) is false.

       ENOSPC
     A message queue identifier is  to be  created  but  the  system-
     imposed  limit  on  the  maximum  number of allowed message queue
     identifiers system wide would be exceeded.

SEE ALSO
       intro(2), msgctl(2), msgrcv(2), msgsnd(2), ftok(3C)

SunOS 5.9   5 Feb 1996      msgget(2)
[/code]
与int open(const char *path, int oflag, /* mode_t mode */...);
差不多, 只是msgget把oflag和mode合在一起成msgflg了.

|
这里的IPC_CREAT  ¦IPC_EXCL  ¦0777是什么意思?为什么都要用位运算连接起来

是因为msgflg是一个整形变量,转化作二进制的话,每一位都有相对应的含义。通过位操作可以对多个标志位进行置位

    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 浮点运算寄存器的问题 iis7站长之家
  • 解析取模运算% 和位与运算& 之间的关系详解
  • Java中的位运算符、移位运算详细介绍
  • python的三目运算符和not in运算符使用示例
  • c# 空合并运算符“??”的使用详解
  • C++中不能被重载的运算符介绍
  • 位运算符有什么用?
  • C++中的异或运算符^的使用方法
  • javascript矩阵运算库 Sylvester
  • java位运算加密示例
  • String的+是不是像c++一样重载运算符?
  • 我想实现数学运算
  • Java 能否实现类似于重载运算符的功能?
  • shell怎么进行幂运算?
  • Integer类型不能进行算术运算?
  • shell中如何进行字符串的运算???
  • 使用BigDecimal进行精确运算(实现加减乘除运算)
  • 如何能将字符串转换成数学运算符
  • ^ 是个什么运算?
  • 请问在shell如何实现字符串子串运算


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3