【发布时间】:2020-10-13 18:51:50
【问题描述】:
我有一个简单的 C 程序调用 wait() 函数。但是,我的程序不包括 sys/wait.h。它仍然可以编译并且工作正常。它的工作本质上是用命令行参数重写进程映像。
在编译期间,我收到以下警告:
my_program.c:在函数'main'中 警告:函数'wait'的隐式声明,你的意思是'main'吗?
我的程序看起来像这样......它完全符合我的要求。我只是不知道为什么当我不包含它时仍然会定义 wait()。
#include <stdlib.h>
#include <sys/types.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
int main(int argc, char **argv)
{
pid_t my_pid;
my_pid = fork();
if (my_pid < 0)
{
printf("The fork didn't work! Terminate\n");
exit(0);
}
if (my_pid != 0)
{
// Parent block
printf("The parent will now wait\n");
wait(NULL);
printf("Done!\n");
}
else
{
// Child block
int resp;
resp = execvp(*(argv+1), argv+1);
printf("There was an error. Response code: %d\n Errno: %s\n", resp, stderror(errno));
}
}
然而,当我添加#include
【问题讨论】:
-
你运行什么命令来编译程序?
wait()函数的定义很可能是在另一个翻译单元中编译的(即sys/wait.c是单独编译的)。编译器只会警告你,因为你没有在main程序中明确提到你想使用这个函数。 -
"它仍然可以编译并且工作正常" -- 不,它会在编译期间发出警告。在某些情况下可能可以接受,但这清楚地表明事情并不“好”。
-
@mercury0114 我正在用“gcc my_program.c”编译它,没有其他会影响实际编译的参数。
-
@JohnBollinger 通过“编译和工作正常”我的意思是在执行过程中无论是否包含 sys/wait.h 都没有明显差异
-
我不怀疑程序无论哪种方式都可以工作,但是编译器已经明确告诉您,当不包含标头时,您的代码存在问题。我确定我听起来很挑剔,但很难低估关注编译器警告的重要性。在这种情况下,它恰好可以工作,因为您的编译器提供了一个扩展来支持遗留代码,而
wait()函数恰好有一个可以利用它的签名。你不会总是那么幸运。