gpt4 book ai didi

c - sigtimedwait() 在超时前返回 EAGAIN

转载 作者:IT王子 更新时间:2023-10-29 00:39:10 25 4
gpt4 key购买 nike

我正在尝试学习如何使用 sigtimedwait(),但我发现它并没有等待超时完成。下面它似乎比它应该更快地返回 EAGAIN 4 秒(每 1 分钟超时快 1 秒):

#include <signal.h>
#include <syslog.h>
#include <stdarg.h>
#include <stddef.h>
#include <errno.h>


int main(int argc, char* argv[]) {
setlogmask(LOG_UPTO(LOG_NOTICE));
openlog ("SIG_TIMED_WAITER", LOG_CONS | LOG_PID | LOG_NDELAY, LOG_LOCAL1);
syslog (LOG_NOTICE, "Started");

sigset_t set;
sigemptyset(&set);
sigaddset(&set, SIGUSR1);

struct timespec to;
to.tv_sec = 240;
to.tv_nsec = 0;

int ret = sigtimedwait(&set, NULL, &to);
if(ret < 0) {
if (errno == EAGAIN) {
syslog (LOG_NOTICE, "EAGAIN: TimedWait complete...");
} else {
syslog (LOG_NOTICE, "ERROR!");
}
} else {
syslog (LOG_NOTICE, "Interrupted by signum: %d.", ret);
}

syslog (LOG_NOTICE, "Terminated.");
closelog();
}

这是输出:

$ tail -f /var/log/syslog|grep "SIG_TIMED_WAITER"
Jan 7 15:39:41 localhost SIG_TIMED_WAITER[13275]: Started
Jan 7 15:43:36 localhost SIG_TIMED_WAITER[13275]: EAGAIN: TimedWait complete...
Jan 7 15:43:36 localhost SIG_TIMED_WAITER[13275]: Terminated.

我原以为会在四秒后看到“EAGAIN:TimedWait complete...”记录。

是我的代码有问题,还是其他原因?请注意,例如,我没有看到等待四分钟的 select()。

最佳答案

LOG_LOCAL1 是保留项。 IE。不要使用它

改为使用 LOG_USER

如果 options 参数也有 LOG_PERROR,则更容易跟进操作

然后输出也会被记录到stderr

这是该程序的更正/工作版本。

#define _GNU_SOURCE

#include <signal.h>
#include <syslog.h>
#include <stdarg.h>
#include <stddef.h>
#include <errno.h>


int main( void )
{
setlogmask(LOG_UPTO(LOG_NOTICE));
openlog ("SIG_TIMED_WAITER", LOG_CONS | LOG_PID | LOG_NDELAY | LOG_PERROR | LOG_PID, LOG_USER);
syslog (LOG_NOTICE, "Started");

sigset_t set;
sigemptyset(&set);
sigaddset(&set, SIGUSR1);

struct timespec to;
to.tv_sec = 240;
to.tv_nsec = 0;

int ret = sigtimedwait(&set, NULL, &to);
if(ret < 0)
{
if (errno == EAGAIN)
{
syslog (LOG_NOTICE, "EAGAIN: TimedWait complete...");
}

else
{
syslog (LOG_NOTICE, "ERROR!");
}
}

else
{
syslog (LOG_NOTICE, "Interrupted by signum: %d.", ret);
}

syslog (LOG_NOTICE, "Terminated.");
closelog();

return 0;
} // end function: main

我正在运行 ubuntu linux 14.04

(在这种情况下,15212 是运行程序的控制台/终端的 PID。)

从控制台/终端(从 stderr 输出)

SIG_TIMED_WAITER[15212]: Started
SIG_TIMED_WAITER[15212]: EAGAIN: TimedWait complete...
SIG_TIMED_WAITER[15212]: Terminated.

来自/var/log/syslog:

Jan  7 05:50:07 rkwill-desktop SIG_TIMED_WAITER[15212]: Started
Jan 7 05:54:07 rkwill-desktop SIG_TIMED_WAITER[15212]: EAGAIN: TimedWait complete...
Jan 7 05:54:07 rkwill-desktop SIG_TIMED_WAITER[15212]: Terminated.

注意:初始输出和 EAGAIN 输出之间的时间为 4 分钟(240 秒)

关于c - sigtimedwait() 在超时前返回 EAGAIN,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34655737/

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