zoukankan      html  css  js  c++  java
  • [每日一点]msgsnd函数代码跟踪

    今天有一同事问我,如果msgsnd函数的最后一个flag如果直接置0,调用该函数会是什么结果!

    我不太清楚是怎样的,还是直接看代码:

    msgsnd是一个系统调用,所以它在glibc中只是一个桩函数:
    \glibc\glibc-2.4.src\sysvipc\msgsnd.c
    int
    msgsnd (msqid, msgp, msgsz, msgflg)
         int msqid;
         const void *msgp;
         size_t msgsz;
         int msgflg;
    {
      __set_errno (ENOSYS);
      return -1;
    }

    stub_warning (msgsnd)

    而在内核中的实现函数:

    ~\kernel\linux-2.6.21.1.src\ipc\msg.c

    Code
    Code

    security_msg_queue_msgsnd函数是调用一个钩子函数,之后没有对flag进行处理。所以,flag只在这个函数中有效:

    即,只有在队列满,且标志位与IPC_NOWAIT或时不为0,则返回错误,否则没有什么影响。如果为0时,与IPC_NOWAIT取或运算显然为不0,所以会阻塞在这里,直到队列可用!

    ================================
      /\_/\                        
     (=^o^=)  Wu.Country@侠缘      
     (~)@(~)  一辈子,用心做一件事!
    --------------------------------
      学而不思则罔,思而不学则怠!  
    ================================
  • 相关阅读:
    JSP基础
    线程控制
    多线程简述
    Servlet生命周期
    同步代码块和同步方法有什么区别?
    java.sql.Date和java.util.Date的区别
    Java自学指南五、编码工具
    基本类型和包装类的区别?
    什么是包装类?为什么要有包装类?基本类型与包装类如何转换?
    什么是Java的垃圾回收机制?
  • 原文地址:https://www.cnblogs.com/WuCountry/p/1506202.html
Copyright © 2011-2022 走看看