gpt4 book ai didi

c++ - 如何检测其他程序关闭的 eventfd 文件描述符

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:42:01 26 4
gpt4 key购买 nike

我有一个客户端/服务器通过 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);

在客户端: 国际电联; rc = dup2(fd,fd);

rc 永远不会无效。

最佳答案

正在检查一个关闭的文件描述符?这个怎么样?

#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

关于c++ - 如何检测其他程序关闭的 eventfd 文件描述符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18363211/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com