我一直在尝试以艰难的方式学习 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/