23,125
社区成员
发帖
与我相关
我的任务
分享
#include <stdlib.h>
#include <stdio.h>
int
main()
{
int pid;
FILE *fp = fopen("1.txt","w");
pid = fork();
if(pid == 0){
printf("pid=%d:the father will close the file %x...\n",pid,*fp);
fclose(fp);
}
sleep(1);
printf("pid=%d:the child will close the file %x\n",pid,*fp);
if(fp!=NULL){
if(fileno(fp)>0){ //把这个判断注释掉可以看到未定义操作效果
fclose(fp);
}
}
}
/*-----------------------------------------------------------------------
未定义行为顾名思义就是标准没有对其作出具体规定的行为。比如“fclose 两次”其行为就是一个未定义行为。
对于未定义行为,标准允许编译器可以任意定义一个具体实现,因此这样的行为其结果不是确定的。比如对于上述未定义行为,其具体实现可以是:fclose函数返回错误码、出现段错误程序终止、或者任何其它可能的实现。
由于未定义行为会使程序出现不确定的运行结果从而达不到程序的预定目的,所以这不是我们所希望出现的。因此,一定不要让未定义行为出现在程序中,这是程序员的一个基本职责。比如,“fclose 两次”这个行为会导致未定义行为,那么在程序中就绝对要避免出现“fclose 两次”这样的错误。
对于程序员来说,导致未定义行为产生的行为(如“fclose 两次”)其实就是标准的禁止事项。如果未定义行为在程序中出现了,说明这个程序违反了标准的规定,是非法程序。
------------------------------------------------------------------------*/