文件读写错误导致父进程无法等到子进程

 问题复现

#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出错处理后程序执行的效果)

这件事告诉我们该有的出错处理不能省略(即要遵守编程规范),不然连错误在哪产生都不好排查。

 

posted @ 2019-11-20 14:44  C_hp  阅读(258)  评论(0编辑  收藏  举报