【发布时间】:2020-03-21 01:43:44
【问题描述】:
从signal.h 联机帮助页中,rt_sigprocmask 的原型如下:
/* Prototype for the glibc wrapper function */
int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);
/* Prototype for the underlying system call */
int rt_sigprocmask(int how, const kernel_sigset_t *set,
kernel_sigset_t *oldset, size_t sigsetsize);
看到kernel_sigset_t 在rt_sigprocmask 的原型中,我假设这种类型的定义将包含在signal.h 中。但是当我尝试在我的程序中使用它时,我收到了 kernel_sigset_t 未声明的错误。
我写了一个简单的小程序来演示错误:
#include <stdio.h>
#include <signal.h>
int main()
{
printf("%d\n", sizeof(kernel_sigset_t));
return 0;
}
当我编译时会给出这个消息:
>gcc -o tmp tmp.c
tmp.c: In function ‘main’:
tmp.c:5:24: error: ‘kernel_sigset_t’ undeclared (first use in this function)
5 | printf("%d\n", sizeof(kernel_sigset_t));
| ^~~~~~~~~~~~~~~
tmp.c:5:24: note: each undeclared identifier is reported only once for each function it appears in
为什么会这样? 我是不是包含了错误的东西,还是什么?
编辑:更多信息
我问这个问题的原因是因为我正在制作一个程序来跟踪两个并行运行的相同程序,并比较每个系统调用的参数以检查它们是否相等。
为此,我需要检查作为指针的系统调用参数是否指向两个跟踪程序中的相同数据。
因此,通过rt_sigprocmask 系统调用,我想检查kernel_sigset_t 指针set 和oldset 是否都指向相同的数据。我会通过比较这些指针指向的地址处的sizeof(kernel_sigset_t) 数据长度来做到这一点,并查看它们是否相同(使用process_vm_readv)。
但是,作为kernel_sigset_t,似乎没有定义,我不知道该怎么做。正如手册页所说,内核的sigset_t 和用户空间的大小不同:我应该如何知道要比较的正确大小是多少?如果我只使用sigset_t,是否正确,如果内核不同?
【问题讨论】:
-
您使用的是什么系统和版本?我查看的
linux/signal.h文件没有定义rt_sigprocmask也没有定义kernel_sigset_t。 Ubuntu page forsignal.h似乎也没有定义它们。你有联机帮助页的链接吗?它可能与您的系统不对应。 -
>cat /proc/versionLinux version 5.3.0-kali2-amd64 (devel@kali.org) (gcc version 9.2.1 20191109 (Debian 9.2.1-19)) #1 SMP Debian 5.3.9-3kali1 (2019-11-20) -
您是否正在查看已安装源包中的标头?
标签: c include system-calls