C 程序在未声明wait()函数后编译并正常工作。为什么?

C 程序在未声明wait()函数后编译并正常工作。为什么?,c,linux,process,operating-system,system-calls,C,Linux,Process,Operating System,System Calls,为了这个节目 #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", g

为了这个节目

#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", getpid(), 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;
}
#包括
#包括
#包括
#包括
#包括
int main()
{
pid_t var1;
int-retVal,retStat;
printf(“程序已启动。进程PID=%d\n”,getpid());
var1=fork();
if(var1<0)
{
perror(“Fork失败\n”);
返回0;
}
else if(var1==0)
{
printf(“pid=%d的子进程正在执行\n”,getpid());
printf(“%d PID进程中的var1值是%d,我的父进程是%d\n”,getpid(),var1,getppid());
}
其他的
{
printf(“pid=%d的进程正在执行”\n“,getpid());
printf(“%d PID进程中的var1值为%d\n”,getpid(),var1);
//等待(空);
retVal=等待(&retStat);
printf(“子进程的返回状态为%d\n”,retStat/256);
printf(“等待的返回值为%d\n”,retVal);
}
printf(“PID=%d的进程已完成\n”,getpid());
返回3;
}
我得到以下警告-
警告:函数“wait”的隐式声明[-Wimplicit函数声明]

但是程序仍然可以编译,等待函数也可以正常工作。我签入了我包含的库,其中任何一个库都没有等待的定义。我知道wait syscall是在
sys/wait.h
中定义的。我只是想知道,即使没有wait()的声明,这个程序是如何正确工作的

即使没有wait()的声明,该程序如何正确工作

无法保证您的程序正确运行。编译器假设
wait()
是一个具有(隐式)签名
int wait()
的函数,即:返回
int
并接受任何参数的函数。调用违反其签名的函数既是ABI违反,也是C标准违反(未定义的行为)

然后链接C库,在运行时您的程序可能会正常工作,因为动态加载程序能够找到并调用它,而真正的签名是
pid\u t wait(int*)
(在大多数系统上
int wait(int*)
),这与隐式假设的签名没有多大区别。然而,总的来说,情况并非如此


有关更多信息,请参阅:

C直到C99允许隐式声明函数。这意味着任何没有声明的函数都将被视为返回int,并且适合您的调用

函数wait实际上具有这种签名,因此在链接阶段,链接器在默认链接库中找到了函数wait

From::包含标题也可以使来自、的所有符号可见,您可以在
“/usr/include/stdlib.h”中的
include
s之后检查这是否是您的情况