父子进程间分发FD

int fd_pair(int fd[2])
{
    return socketpair(AF_UNIX, SOCK_DGRAM, 0, fd);
}

int fd_send(int sockfd, int fd, int type)
{
    int data;
    struct iovec iov_data;
    struct msghdr msg_hdr;
    struct cmsghdr *cmsg_hdr;
    char msg_ctrl[CMSG_SPACE(1*sizeof(int))];
    memset(msg_ctrl, 0, CMSG_SPACE(1*sizeof(int)));

    data = type;
    iov_data.iov_base = &data;
    iov_data.iov_len = sizeof(int);

    msg_hdr.msg_name = NULL;
    msg_hdr.msg_namelen = 0;
    msg_hdr.msg_iov = &iov_data;
    msg_hdr.msg_iovlen = 1;
    msg_hdr.msg_control = msg_ctrl;
    msg_hdr.msg_controllen = CMSG_SPACE(1*sizeof(int));
    msg_hdr.msg_flags = 0;

    cmsg_hdr = CMSG_FIRSTHDR(&msg_hdr);
    cmsg_hdr->cmsg_len = CMSG_LEN(1*sizeof(int));
    cmsg_hdr->cmsg_level = SOL_SOCKET;
    cmsg_hdr->cmsg_type = SCM_RIGHTS;
    ((int*)CMSG_DATA(cmsg_hdr))[0] = fd;

    return sendmsg(sockfd, &msg_hdr, 0);
}

int fd_recv(int sockfd, int *fd, int *type)
{
    int ret;
    int data;
    struct iovec iov_data;
    struct msghdr msg_hdr;
    struct cmsghdr *cmsg_hdr;
    char msg_ctrl[CMSG_SPACE(1*sizeof(int))];
    memset(msg_ctrl, 0, CMSG_SPACE(1*sizeof(int)));

    iov_data.iov_base = &data;
    iov_data.iov_len = sizeof(int);

    msg_hdr.msg_name = NULL;
    msg_hdr.msg_namelen = 0;
    msg_hdr.msg_iov = &iov_data;
    msg_hdr.msg_iovlen = 1;
    msg_hdr.msg_control = msg_ctrl;
    msg_hdr.msg_controllen = CMSG_SPACE(1*sizeof(int));
    msg_hdr.msg_flags = 0;

    cmsg_hdr = CMSG_FIRSTHDR(&msg_hdr);
    cmsg_hdr->cmsg_len = CMSG_LEN(1*sizeof(int));
    cmsg_hdr->cmsg_level = SOL_SOCKET;
    cmsg_hdr->cmsg_type = SCM_RIGHTS;
    ((int *)CMSG_DATA(cmsg_hdr))[0] = -1;

    if((ret = recvmsg(sockfd, &msg_hdr, 0)) <= 0)
        return ret;

    if(fd) *fd = ((int*)CMSG_DATA(cmsg_hdr))[0];
    if(type) *type = data;
    return ret;
}

void fd_close(int fd)
{
    if(fd > 0)
        close(fd);
}

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值