我有一个客户端/服务器通过eventfd进行通信。如果客户端或服务器调用close(fd)
我希望另一端找到(就像文件描述符现在关闭)。我尝试使用select
非零超时,它总是返回0,即超时。我看到人们建议使用fcntl
它似乎也没有用。有什么建议吗?
添加详细信息(省略非重要的部分代码,您可以看到here for how to exchange file descriptor detail code: 它是多进程应用程序。服务器进程通过调用
创建了eventfd struct msghdr control_message;
int fd = eventfd(0,0);
*CMSG_DATA(control_message) = fd;
message.msg_control = &control_message;
sendmsg(socket_fd, & message,0); //send this to client
从客户端:
recvmsg(socket_fd, & message,0);
//loop using CMSG_NXTHDR(&message, control_message)
int fd = *(int *) CMSG_DATA(contro_message);
然后在服务器端:
close(fd);
在客户端: int rc; rc = dup2(fd,fd);
rc永远无效。
答案 0 :(得分:-1)
检查已关闭的文件描述符?怎么样?
#include <errno.h>
#include <stdio.h>
#include <string.h>
static void checkit ()
{
int rc;
rc = dup2(2, 2);
if ( rc == -1 )
printf("error %d on dup2(2, 2): %s\n", errno, strerror(errno));
else
printf("dup2 successful\n");
write(2, "still working\n", 14);
}
int main (int argc, char **argv)
{
int rc;
checkit();
close(2);
checkit();
return 0;
}
运行它会生成此输出:
dup2 successful
still working
error 9 on dup2(2, 2): Bad file descriptor
如果这是一个使用poll的多线程应用程序,并且您希望在另一个线程关闭文件描述符时返回poll,则POLLERR,POLLHUP或POLLNVAL可能有所帮助。
使用民意调查的多线程版本
这是一个示例,演示如何在多线程程序中使用poll(POLLNVAL是事件)检测关闭的fd:
#include <errno.h>
#include <poll.h>
#include <pthread.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
static void *run_poll (void *arg)
{
struct pollfd fds[1];
int rc;
fds[0].fd = 2;
fds[0].events = POLLERR | POLLHUP | POLLNVAL;
//
// Poll indefinitely
//
printf("starting poll\n");
fflush(stdout);
rc = poll((struct pollfd *) &fds, 1, -1);
if ( rc == -1 )
{
printf("POLL returned error %d: %s\n", errno, strerror(errno));
}
else
{
printf("POLL returned %d (revents = 0x%08x): %s %s %s\n",
rc,
fds[0].revents,
( ( fds[0].revents & POLLERR ) ? "pollerr" : "noerr" ),
( ( fds[0].revents & POLLHUP ) ? "pollhup" : "nohup" ),
( ( fds[0].revents & POLLNVAL ) ? "pollnval" : "nonval" ));
}
return NULL;
}
int main (int argc, char **argv)
{
pthread_t thread;
int rc;
rc = pthread_create(&thread, NULL, run_poll, NULL);
usleep(100);
printf("closing stderr\n");
close(2);
usleep(100);
return 0;
}
这会生成输出
starting poll
closing stderr
POLL returned 1 (revents = 0x00000020): noerr nohup pollnval