linux 文件描述符共享,我可以将文件描述符共享给Linux上的另一个进程,还是它们是进程的本地进程?...

5b96b6b3856601dfb14f0680b3e0a7d3.png

慕妹3242003

您可以通过unix域套接字将文件描述符传递给另一个进程。这是传递这样一个文件描述符的代码,取自Unix网络编程ssize_twrite_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 */这是接收文件描述符的代码ssize_tread_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、付费专栏及课程。

余额充值