如何解决程序在没有声明wait函数后编译,并且可以正常工作为什么?
对于程序
#include<stdio.h>
#include<stdlib.h>
#include<errno.h>
#include<unistd.h>
#include<sys/types.h>
int main()
{
pid_t var1;
int retVal,retStat;
printf("Program Started. Process PID = %d\n",getpid());
var1 = fork();
if(var1 < 0)
{
perror("Fork failed\n");
return 0;
}
else if(var1 == 0)
{
printf("Child process with pid = %d is executing\n",getpid());
printf("The var1 value in %d PID process is %d,my parent is %d\n",getpid(),var1,getppid());
}
else
{
printf("Process with pid = %d is executing\n",getpid());
printf("The var1 value in %d PID process is %d\n",var1);
// wait(NULL);
retVal = wait(&retStat);
printf("Return status of child process is %d\n",retStat / 256);
printf("Return value for wait is %d\n",retVal);
}
printf("Process with PID = %d completed\n",getpid());
return 3;
}
我收到以下警告-
warning: implicit declaration of function ‘wait’ [-Wimplicit-function-declaration]
但是程序仍然可以编译,并且等待功能可以正常工作。我检查了我包含的库,但在任何库中都没有等待的定义。我知道在sys/wait.h
中定义了等待系统调用。我只是想知道即使没有声明wait()后,该程序如何正常工作。
解决方法
即使没有声明wait()后,该程序如何正常工作
不能保证您的程序正确运行。编译器 假定 :wait()
是带有(隐式)签名int wait()
的函数,即:返回{{1}的函数并接受任何参数。调用违反其签名的函数既违反ABI,也违反C标准(行为未定义)。
然后链接了C库,并且在运行时您的程序可能最终可以正常运行,因为动态加载程序能够找到int
并对其进行调用,并且真实签名为wait()
(大多数情况下,系统pid_t wait(int *)
),与隐式假定的系统没有什么不同。但是,通常情况并非如此。
有关更多信息,请参见:Implicit function declarations in C
,C直到C99允许隐式声明函数。意味着任何没有声明的函数都将被视为返回一个int并适合您的调用。
功能等待实际上具有这种签名,因此在链接阶段,链接器在默认链接库中找到了功能等待。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。