[每日一点]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@侠缘      
 (~)@(~)  一辈子,用心做一件事!
--------------------------------
  学而不思则罔,思而不学则怠!  
================================
原文地址:https://www.cnblogs.com/WuCountry/p/1506202.html