c - 如何在循环中等待两种类型的事件(C)?

标签 c linux events concurrency condition-variable

我试图在 while-true 循环中等待 waitpid()read()。具体来说,我等待这两个事件中的任何一个,然后在循环的每次迭代中处理它。目前,我有以下实现(这不是我想要的)。

while (true) {
  pid_t pid = waitpid(...);
  process_waitpid_event(...);

  ssize_t sz = read(socket, ....);
  process_read_event(...);
}

这个实现的问题是第二个事件的处理依赖于第一个事件的完成。我不想按顺序处理这两个事件,而是希望处理在循环的每次迭代中首先出现的事件。我应该怎么做?

最佳答案

如果你不想接触线程,你可以在调用 waitpid 的选项中包含它:

pid_t pid = waitpid(pid, &status, WNOHANG);

来自 waitpid 的联机帮助页:

WNOHANG - return immediately if no child has exited.

因此,如果 waitpid 没有准备好,它不会阻塞,程序会继续前进到下一行。

至于read,如果它阻塞了你可能想看看poll(2)。您基本上可以检查您的套接字是否在每个设定的时间间隔准备就绪,例如250ms,到时调用read。这将允许它不阻塞。

您的代码可能看起来有点像这样:

// Creating the struct for file descriptors to be polled.
struct pollfd poll_list[1];
poll_list[0].fd = socket_fd;
poll_list[0].events = POLLIN|POLLPRI;
// POLLIN  There is data to be read
// POLLPRI There is urgent data to be read

/* poll_res  > 0: Something ready to be read on the target fd/socket.
** poll_res == 0: Nothing ready to be read on the target fd/socket.
** poll_res  < 0: An error occurred. */
poll_res = poll(poll_list, 1, POLL_INTERVAL);

这只是假设您从套接字读取,从代码中的变量名判断。正如其他人所说,您的问题可能需要一些更重的任务,例如线程。

关于c - 如何在循环中等待两种类型的事件(C)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41083219/

相关文章:

c - 如何将 phys_addr_t 类型的值返回给用户空间

c++ - GCC 和 MinGW (C++) 之间奇怪的输出差异

php - 禁用并发 Flash 视频流

c++ - C++ 和 Objective C 之间的事件处理

JavaScript:删除事件监听器

c - 使用 GCC + ARM 减少递归期间的堆栈使用

java - 为什么 C 和 Java 对 float 的舍入方式不同?

c++ - 对单行 if 或循环使用大括号(即 {})的目的是什么?

c++ - LabVIEW Linux C++开发——初学者问题

c# - 将任何控件与滚动条一起使用时,不会触发 MouseWheel 事件(在 C# Windows 窗体中)