Linux c 编程问题请教,父进程如何保证在读取子进程写入的文件之前子进程已经写入完毕? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
qemu32
V2EX    Linux

Linux c 编程问题请教,父进程如何保证在读取子进程写入的文件之前子进程已经写入完毕?

  •  
  •   qemu32 2022-09-16 13:46:34 +08:00 2213 次点击
    这是一个创建于 1187 天前的主题,其中的信息可能已经有所发展或是发生改变。
     pid = fork(); if (!pid) { execvp(args[0], args); // 这里会创建一个路径为 path 的文件,并且会写入一些数据。 } wait(&wstatus); fd = open(path, O_RDONLY); // 读取子进程创建的文件 while ((n = read(fd, buf, BUFSIZ)) > 0) if (write(connfd, buf, n) != n) printf("write error\n"); 

    这段代码先 fork 一个子进程,子进程创建并写入一些数据到一个文件。

    父进程通过 wait 等待子进程执行完毕,然后 open 并开始读取子进程写入的文件。

    这段代码有一个问题,就是有时子进程明明写入了一些数据到文件,但父进程却读取不到任何数据,就像子进程只是创建了一个空文件一样,如果在 wait 后加一个 sleep(1)就没有这种情况,请问如何保证子进程写入文件完毕后父进程才开始读取?

    14 条回复    2022-09-16 23:09:50 +08:00
    BingoXuan
        1
    BingoXuan  
       2022-09-16 14:03:58 +08:00
    试一下子进程写入文件加上 O_SYNC 。我觉得这种情况不应该先创建文件,通过 fork 共享文件不会更好吗?
    nightwitch
        2
    nightwitch  
       2022-09-16 14:05:31 +08:00 via Android
    给文件加锁,父进程 flush 以后再解锁
    qemu32
        3
    qemu32  
    OP
       2022-09-16 14:08:10 +08:00
    @BingoXuan 感谢回复,子进程不是我的项目,不能去改子进程的代码,其实我是想去开发一个分布式编译系统,这个子进程就是 gcc ,父进程是需要把 gcc 编译生成的可重定位目标文件读取出来再通过网络传给客户端。
    qemu32
        4
    qemu32  
    OP
       2022-09-16 14:09:07 +08:00
    @nightwitch 感谢回复,能说的再具体一点吗?
    codehz
        5
    codehz  
       2022-09-16 14:14:29 +08:00
    (linux 的话,可以要求 gcc 生成文件到 /dev/stdout 的,然后你直接 pipe 一下就可以接收了
    JohnBull
        6
    JohnBull  
       2022-09-16 14:15:58 +08:00
    你是不是还有别的子进程?你确定 wait 到的一定是你刚才创建的进程吗?
    你改用 waitpid 指定下 pid 试试呢
    codehero
        7
    codehero  
       2022-09-16 14:17:55 +08:00
    是 gcc 的话用 waitpid 等 gcc 结束再读应该可以
    qemu32
        8
    qemu32  
    OP
       2022-09-16 14:19:07 +08:00
    @codehz 也是一种办法
    qemu32
        9
    qemu32  
    OP
       2022-09-16 14:19:53 +08:00
    @nhf0424 确实,我这里是会有好多个子进程,应该就是这个原因。
    qemu32
        10
    qemu32  
    OP
       2022-09-16 14:24:04 +08:00
    @nhf0424 改用 waitpid 就正常了,结贴
    julyclyde
        11
    julyclyde  
       2022-09-16 17:33:42 +08:00
    不容易判断消息的边界 /结束
    这正是我在 /t/878224 反对使用文件做 ipc 的原因
    elechi
        12
    elechi  
       2022-09-16 19:21:41 +08:00
    写完文件 flush ,确保文件写入完成
    JohnBull
        13
    JohnBull  
       2022-09-16 23:05:11 +08:00
    @julyclyde 可以用文件锁解决
    DeWjjj
        14
    DeWjjj  
    PRO
       2022-09-16 23:09:50 +08:00
    写进缓存,然后读取有天然保护。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     3621 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 38ms UTC 10:29 PVG 18:29 LAX 02:29 JFK 05:29
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86