程序在没有声明 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。
对于节目
#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。