linux 文件描述符共享,我可以將文件描述符共享到linux上的另一個進程,還是它們是本地的進程?...

48

You can pass a file descriptor to another process over unix domain sockets. Here's the code to pass such a file descriptor, taken from Unix Network Programming

可以通過unix域套接字將文件描述符傳遞給另一個進程。下面是傳遞此類文件描述符的代碼,這些描述符來自Unix網絡編程

ssize_t

write_fd(int fd, void *ptr, size_t nbytes, int sendfd)

{

struct msghdr msg;

struct iovec iov[1];

#ifdef HAVE_MSGHDR_MSG_CONTROL

union {

struct cmsghdr cm;

char control[CMSG_SPACE(sizeof(int))];

} control_un;

struct cmsghdr *cmptr;

msg.msg_control = control_un.control;

msg.msg_controllen = sizeof(control_un.control);

cmptr = CMSG_FIRSTHDR(&msg);

cmptr->cmsg_len = CMSG_LEN(sizeof(int));

cmptr->cmsg_level = SOL_SOCKET;

cmptr->cmsg_type = SCM_RIGHTS;

*((int *) CMSG_DATA(cmptr)) = sendfd;

#else

msg.msg_accrights = (caddr_t) &sendfd;

msg.msg_accrightslen = sizeof(int);

#endif

msg.msg_name = NULL;

msg.msg_namelen = 0;

iov[0].iov_base = ptr;

iov[0].iov_len = nbytes;

msg.msg_iov = iov;

msg.msg_iovlen = 1;

return(sendmsg(fd, &msg, 0));

}

/* end write_fd */

And here's the code to receive the file descriptor

這是接收文件描述符的代碼

ssize_t

read_fd(int fd, void *ptr, size_t nbytes, int *recvfd)

{

struct msghdr msg;

struct iovec iov[1];

ssize_t n;

int newfd;

#ifdef HAVE_MSGHDR_MSG_CONTROL

union {

struct cmsghdr cm;

char control[CMSG_SPACE(sizeof(int))];

} control_un;

struct cmsghdr *cmptr;

msg.msg_control = control_un.control;

msg.msg_controllen = sizeof(control_un.control);

#else

msg.msg_accrights = (caddr_t) &newfd;

msg.msg_accrightslen = sizeof(int);

#endif

msg.msg_name = NULL;

msg.msg_namelen = 0;

iov[0].iov_base = ptr;

iov[0].iov_len = nbytes;

msg.msg_iov = iov;

msg.msg_iovlen = 1;

if ( (n = recvmsg(fd, &msg, 0)) <= 0)

return(n);

#ifdef HAVE_MSGHDR_MSG_CONTROL

if ( (cmptr = CMSG_FIRSTHDR(&msg)) != NULL &&

cmptr->cmsg_len == CMSG_LEN(sizeof(int))) {

if (cmptr->cmsg_level != SOL_SOCKET)

err_quit("control level != SOL_SOCKET");

if (cmptr->cmsg_type != SCM_RIGHTS)

err_quit("control type != SCM_RIGHTS");

*recvfd = *((int *) CMSG_DATA(cmptr));

} else

*recvfd = -1; /* descriptor was not passed */

#else

/* *INDENT-OFF* */

if (msg.msg_accrightslen == sizeof(int))

*recvfd = newfd;

else

*recvfd = -1; /* descriptor was not passed */

/* *INDENT-ON* */

#endif

return(n);

}

/* end read_fd */

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值