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

时间:2013-12-08 05:55:19

标签: 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。感谢。

1 个答案:

答案 0 :(得分:2)

C中未指定strsignalWCOREDUMP(已选中C99)。因此,如果您将GCC严格地置于ANSI模式(这将使您获得C90),您将不会将它们开箱即用。

strsignal在POSIX中定义,但WCOREDUMP不是(对于POSIX,请参阅wait,Linux联机帮助页指出它不是POSIX),所以你甚至无法得到它如果你添加POSIX扩展名。

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