问题描述
利用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