众所周知,⼦进程会继承⽗进程已经打开的⽂件描述符fd,但是fork之后的是不会被继承的,这个时候是否⽆能⽆⼒了?答应 scm文件
是NO。Linux提供了⼀个系统调⽤sendmsg,借助它,可以实现进程间传递⽂件描述符fd,⽽且不仅限于⽗进程到⼦进程。sendmsg函数的原型如下:
#include <sys/socket.h>
ssize_t send msg(int socket, const struct msghdr *message, int flags);
ssize_t recv msg(int socket, struct msghdr *message, int flags);
recv msg函数⽤来接收fd,这⾥的socket必须为UnixSocket(AF_UNIX),在Linux上执⾏man 7 unix,并搜索SCM_RIGHTS,即看到有关说明:Send or receive a set of open file descriptors from another process。
通过send msg发送的fd,并不是将fd值传递给⽬标进程,⽽是活⽣⽣地在⽬标进程空间⾥复制指向同⼀个file结构体的fd,所以不要期望在两个进程中,fd值相同。
具体的使⽤⽰例,请baidu或google关键词:sendmsg fd,即可到,这⾥就不多说了。