sách gpt4 ai đã đi

c - SIG_DFL đưa ra cảnh báo tại thời điểm biên dịch, bị hệ điều hành bỏ qua tại thời điểm thực thi

In lại 作者:塔克拉玛干 更新时间:2023-11-03 00:19:53 28 4
mua khóa gpt4 Nike

我有一个小问题,看起来很奇怪。我写了这段代码来处理信号。

void sig_install(wlist *arg)
{
struct sigaction sigstruct;
//Doing stuff
sigstruct.sa_handler = &handlerfunc;
sigstruct.sa_flags = SA_RESTART;
sigaction(sig, &sigstruct, NULL)
}

而且这个效果非常好。我必须定义

#define _POSIX_C_SOURCE 200809L

解析 SA_RESTART 标志(我的教授告诉我使用它)。我的问题如下:我到处都读到我可以使用 SIG_DFL 和 sigaction 为我的信号安装默认处理程序,例如:

void sig_uninstall(wlist *arg)
{
//Do stuff
if (sigaction(sig, SIG_DFL, NULL) == 0)
printf("Signalhandler deleted!\n");
khác
printf("Signalhandler could not be deleted!\n");
}

但是当我编译它时,我收到一条关于 SIG_DFL 参数的警告:

»const struct sigaction * __restrict__« expected, but Argument is type »void (*)(int)«

当我执行程序时,sigaction() 成功返回 0,但是当我发送信号时,我的信号处理程序仍然不是默认值。

我的标题中的定义是:

#define SIG_DFL ((__sighandler_t) 0) /* Default action. */
# define SA_RESTART 0x10000000 /* Restart syscall on signal return. */
/* Get and/or set the action for signal SIG. */
extern int sigaction (int __sig, __const struct sigaction *__restrict __act,
struct sigaction *__restrict __oact) __THROW;

我在 mandb 中读到 SA_RESTART 仅在 BSD 上使用。这可能是问题所在吗?是否有 linux 的替代标志?(在大学里我们必须使用 BSD,但在家里我使用 linux)。非常感谢您的宝贵时间。

1 Câu trả lời

需要将struct sigactioncủasa_handler(伪)成员设置为SIG_DFL, thay vìstruct sigaction *本身。

或者,只需使用 tín hiệu() 即可。

关于c - SIG_DFL 在编译时抛出警告,在执行时被 OS 忽略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23710511/

28 4 0
Bài viết được đề xuất: Linux内核版本差异
Bài viết được đề xuất: linux - 将 Fortran 代码链接到库
Bài viết được đề xuất: C (linux) - 模拟/跳过 scanf 输入
Bài viết được đề xuất: c - 我是否需要在 fork 之后在父进程中等待()?
Giấy chứng nhận ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com