我试图在 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/