Tag: kqueue

在哪里为SIGPIPE声明sig_t信号

我目前正在使用kqueue来处理Serverprocess中每个线程的多个客户端,因此我不希望在Signal SIGPIPE出现时终止该线程,我只想从kqueue中删除相应的socked id。 所以我的问题是:有没有办法在Signalhandle中获取相应的socketid并将其解析回Process以从事件kqueue中删除它,或者我将jsut转换为SIGPIPE的SIG_IGN并通过返回-1来处理删除发送? 并且它会在超时时间后返回-1值还是立即返回-1? 最后,如果信号忽略是我的解决方案:其中id必须放置声明 typedef void (*sig_t) (int); sig_t signal(int sig, sig_t func); 它必须在主要function? 还是在相应线程的开头? 还是作为全球元素?

如何用kevent()替换select()以获得更高的性能?

来自Kqueue维基百科页面 : Kqueue在内核和用户空间之间提供高效的输入和输出事件管道。 因此,可以修改事件filter以及接收未决事件,同时每个主事件循环迭代仅使用对kevent(2)的单个系统调用。 这与较旧的传统轮询系统调用形成对比,例如poll(2)和select(2)效率较低,尤其是在对大量文件描述符上的事件进行轮询时 这听起来很不错。 我为我的服务器定位FreeBSD,我正在处理大量的网络套接字fd – 在它们上面使用select()并确定从哪里读取数据。 我宁愿使用kevent()调用来获得更高的性能,因为它就是它的用途! 我在这里阅读了关于FreeBSD的kevent的手册页,但它对我来说很神秘,我找不到解释它的好资源。 使用kevent替换select的一个例子可以解决我的问题,也可以帮助我更好地了解如何使用kevent()。

Mac OS和FreeBSD之间的fifos kqueue处理的区别?

我正在开发一个使用fifos for IPC的应用程序,并使用事件通知API(例如epoll或kqueue)来监视要读取的数据的fifos。 应用程序期望如果fifo的编写器终止,读者将通过事件通知API接收事件,允许读者注意到编写器终止。 我目前正在将此应用程序移植到macos中,并且我遇到了一些kqueue的奇怪行为。 我已经能够创建这种行为的再现者: #include #include #include #include #include #include #include #include #include #include static int child() { char child_fifo_path[64]; char parent_fifo_path[64]; printf(“Child %d\n”, getpid()); sprintf(child_fifo_path, “/tmp/child-%d”, getpid()); sprintf(parent_fifo_path, “/tmp/parent-%d”, getpid()); mkfifo(child_fifo_path, 0644); mkfifo(parent_fifo_path, 0644); int parent_fd = open(parent_fifo_path, O_RDONLY); if (parent_fd == -1) { perror(“open”); return EXIT_FAILURE; } unsigned char parent_val; read(parent_fd, […]