程序在没有声明 wait() 函数后编译并正常运行。为什么?

Program compiles after no declaration for wait() function and works correctly. Why?

对于节目

#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;
}

我收到以下警告 - warning: implicit declaration of function ‘wait’ [-Wimplicit-function-declaration]

但是程序仍然可以编译并且等待函数可以正常工作。我检查了我包含的库,其中任何一个都没有等待的定义。我知道等待系统调用是在 sys/wait.h 中定义的。我只想知道这个程序如何在没有声明 wait() 的情况下正常工作。

how does this program work correctly even after no declaration for wait()

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

然后链接 C 库,在运行时您的程序可能会正常运行,因为动态加载器能够找到 wait() 并调用它,而真正的签名是 pid_t wait(int *)(在大多数系统上 int wait(int *)),这与隐含假设的系统没有什么不同。然而,一般情况下,情况并非如此。

有关详细信息,请参阅:Implicit function declarations in C

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

函数wait实际上有那种签名,所以在链接阶段,链接器在默认链接库中找到了函数wait。