文件读写错误导致父进程无法等到子进程
问题复现
#include<stdlib.h> #include<time.h> #include<error.h> #include<errno.h> #include<stdio.h> #include<sys/types.h> #include<unistd.h> #include<sys/wait.h> int Fgets(const char *file, char *str) { FILE *fd1; fd1 = fopen(file, "r+"); if(fd1 == NULL) { printf("open file error!\n"); exit(1); } fgets(str, 11, fd1); fclose(fd1); } int main() { int stat = 0, i = 0;
pid_t pid; char p[20] = {0}; pid = fork(); if(pid == 0) { Fgets("a.cgf", p); } else { wait(&stat); while(i<5) { printf("parent process running!\n"); ++i; } } exit(0); }
如果进程以"r+"的形式打开文件,文件不存在进程会被直接终止,如果该进程是子进程,且父进程有等待子进程,父进程会无视wait函数直接执行。
当时我在写Fgets函数时着急没有fopen函数的做出错判断,默认它一定会打开成功,然后在子进程将文件名a.cfg写成了a.cgf,由于当前目录没有a.cgf文件,而且打开文件的方式为r+,操作系统直接杀死了子进程,但是未显式告知,让我一度以为自己的wait函数使用错了。
这个错误在主进程执行时遇到和在子进程遇到是操作系统处理不同,在主进程遇到,程序会被直接中断,然后显式告诉我出现错误。
(将Fgets函数提前到创建子进程以前,且去掉Fgets里的open出错处理后程序执行的效果)
这件事告诉我们该有的出错处理不能省略(即要遵守编程规范),不然连错误在哪产生都不好排查。
不积小流无以成江河