socketpair函数创建的文件描述符无法在进程间传递数据

新手上路,请多包涵

问题描述

利用socketpair函数创建的描述符,传递到线程中,想在线程中利用该特殊管道传递文件描述符,但是提示错误:无效的文件描述符

相关代码

创建管道:
socketpair(AF_UNIX, SOCK_STREAM, 0, fds);
if (rv < 0) 
{
    printf("Call socketpair error, errno is %d\n", errno);
    return errno;
}
pid=fork();
pstru.tcp_sock = serv_sock;
pstru.pip_sock = fds[1];

传递到线程:
pthread_create(&t_id[j],NULL,handle_clnt,(void*)&pstru);
线程中利用sendmsg发送文件描述符:
write(pip_sock,buf,str_len);//写
send_fd(pip_sock, ep_events[i].data.fd);


sendmsg函数:
int send_fd(int fd, int fd_to_send)
{
    struct msghdr msg;
    struct iovec iov[1];
    char buf[100];
    union {  //保证cmsghdr和msg_control对齐
        struct cmsghdr cm;
        char control[CMSG_SPACE(sizeof(int))];
    } control_un;
    struct cmsghdr *pcmsg;
    int ret;
 
 
    //udp需要,tcp无视
    msg.msg_name = NULL;
    msg.msg_namelen = 0;
    iov[0].iov_base = buf;
    iov[0].iov_len = 100;
    msg.msg_iov = iov;
    msg.msg_iovlen = 1;
    //设置缓冲区和长度
    msg.msg_control = control_un.control;
    msg.msg_controllen = sizeof(control_un.control);
    //直接通过CMSG_FIRSTHDR取得附属数据
    pcmsg = CMSG_FIRSTHDR(&msg);
    pcmsg->cmsg_len = CMSG_LEN(sizeof(int));
    pcmsg->cmsg_level = SOL_SOCKET;
    pcmsg->cmsg_type = SCM_RIGHTS;  //指明发送的是描述符
    *((int*)CMSG_DATA(pcmsg)) == fd_to_send;  //把描述符写入辅助数据
 
    ret = sendmsg(fd, &msg, 0);
    if(ret < 0) {
        printf("sendmsg error, errno is %d\n", errno);
        printf("%s\n",strerror(errno));
        printf ("ret = %d, filedescriptor = %d\n", ret, fd_to_send);
        return errno;
    }

    return 0;
}

错误打印:
sendmsg error, errno is 9
Bad file descriptor
ret = -1, filedescriptor = 8

阅读 1.7k
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进