【问题标题】:mmap code executing code block twice in output filemmap 代码在输出文件中执行代码块两次
【发布时间】:2022-11-02 03:01:34
【问题描述】:

我有这个关于父/子关系的基本代码:

#define _DEFAULT_SOURCE
#include <stdio.h>
#include <unistd.h>
#include <sys/mman.h>
#include <sys/wait.h>
#include <stdlib.h>
#include <sys/types.h>


int main(){
    int sum = 6;
    int *p = (int*) mmap(NULL, sizeof (int) , PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS, -1, 0);
    *p = 7;
    printf("filled %d in memory\n", *p);
    int pID = fork();
    if (pID == 0){
        printf(" found %d\n", *p);
        printf(" sum inside %d\n",sum + (*p));
        exit(0);
    }
    else if (pID> 0){
        wait(NULL);
        printf("sum %d\n",sum+ *p);
        printf("exit\n");
        exit(0);
    }
    return 0;
}

当我在终端中编译它时,它给了我这个结果:

filled 7 in memory
 found 7
 sum inside 13
sum 13
exit

但是当我想使用./a.out &gt; output.txt 命令将该输出保存在.txt 文件中时,我的代码似乎运行了两次填充块,并且我的output.txt 文件被填充了:

filled 7 in memory
 found 7
 sum inside 13
filled 7 in memory //**printed twice
sum 13
exit

我该如何解决?

【问题讨论】:

    标签: c shared-memory


    【解决方案1】:

    这与mmap 无关,纯粹是关于你对fork 的使用。

    fork 不会为您刷新缓冲区,因此如果您在输出缓冲区中使用未刷新的数据进行分叉,则子节点将包含相同的数据并最终将其刷新。在这种情况下,一个简单的解决方案是在 fork 之前手动 flush stdout

    // ...
    printf("filled %d in memory
    ", *p);
    fflush(stdout);  // To flush all output streams in more complicated cases: fflush(NULL)
    int pID = fork();
    // ...
    

    您只在写入文件时看到它的原因是,当stdout 连接到终端(在大多数系统上)时,它是行缓冲的,printf 中的换行符确保它被刷新。当它没有连接到终端时,它通常是块缓冲的(所以当fork 发生时,数据仍在缓冲区中)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-08
      相关资源
      最近更新 更多