c - 如何在 ANSI C 中使用 strsignal 和 WCOREDUMP?

标签 c signals fork core ansi

我一直在尝试以艰难的方式学习 C - 发出基本调用,观察它们失败,并试图弄清楚发生了什么。目前我正在使用 fork() 以及父进程和子进程之间的互操作。一切都按预期工作,除了今晚我将 -ansi 引入我的 CFLAGS。那时,我从 make 收到了这些消息:

waitpid.c: In function ‘wait_for_child’:
waitpid.c:63:3: warning: implicit declaration of function ‘strsignal’ [-Wimplicit-function-declaration]
   printf("child exited with signal %s\n", strsignal(WTERMSIG(child_status)));
   ^
waitpid.c:63:3: warning: format ‘%s’ expects argument of type ‘char *’, but argument 2 has type ‘int’ [-Wformat=]
waitpid.c:64:3: warning: implicit declaration of function ‘WCOREDUMP’ [-Wimplicit-function-declaration]
   if ( WCOREDUMP(child_status) ) {
   ^

gcc -C -E 的输出完全不同,这取决于我是否也指定了 -ansi。两者都显示了 WIFEXITED、WEXITSTATUS、WIFSIGNALED 和 WTERMSIG 的扩展,但只有非 ANSI 版本扩展了 WCOREDUMP。它也是从 sys/wait.h 中获取 strsignal 声明的那个。

我推断 ANSI C 不支持 strsignal 和 WCOREDUMP,尽管我找不到任何明确的说明。有没有其他方法来执行它们的功能?还是我缺少一些基本的东西?

完整代码位于 http://pastebin.com/hQ2pR7fF .谢谢。

最佳答案

都不是strsignal WCOREDUMP 也未在 C 中指定(选中 C99)。因此,如果您将 GCC 严格设置为 ANSI 模式(这会让您使用 C90),您将无法开箱即用。

strsignal 是在 POSIX 中定义的,但 WCOREDUMP 不是(请参阅 wait 了解 POSIX,Linux 联机帮助页指出它不是 POSIX),因此您可以'即使您添加了 POSIX 扩展,也不会得到它。

获得两者的最简单方法是在包含任何 header (或直接在编译命令行上)之前为 Linux 定义 _GNU_SOURCE
对于 Mac OS X,您可能(没有可用的)需要 _BSD_SOURCE_POSIX_C_SOURCE 定义为 200809L 或以上的内容。

关于c - 如何在 ANSI C 中使用 strsignal 和 WCOREDUMP?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20450390/

相关文章:

c - 当我打印我的字符串时,它打印的长度超过了它的长度

c - vector 中的*是什么?

c - 从 pthread 到 main 的信号

具有非确定性输出的 C fork and pipe 程序

python - python 中的 fork 服务器

c - 使用 fgets + 动态内存分配

c++ - 是否有工具可以在定义的开关下剥离代码?

concurrency - 如何保证多个子进程的信号传递

c++ - 旋转框的值,就在其更改之前

c - 为什么我的 fork() 不 fork 一个 child 并输出打印语句?