我有這個關于父/子關系的基本代碼:
#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 > output.txt命令將該輸出保存在 .txt 檔案中時,我的代碼似乎運行了兩次填充塊,并且我的 output.txt 檔案由以下內容填充:
filled 7 in memory
found 7
sum inside 13
filled 7 in memory //**printed twice
sum 13
exit
我該如何解決?
uj5u.com熱心網友回復:
這與 . 無關mmap,純粹是您使用fork.
fork不會為您重繪 緩沖區,因此如果您在輸出緩沖區中使用未重繪 的資料進行分叉,則子節點將包含相同的資料并最終將其重繪 。在這種情況下,一個簡單的解決方案是flush stdout在fork:
// ...
printf("filled %d in memory\n", *p);
fflush(stdout); // To flush all output streams in more complicated cases: fflush(NULL)
int pID = fork();
// ...
您僅在寫入檔案時看到它的原因是,當stdout連接到終端(在大多數系統上)時,它是行緩沖的,并且您的換行符printf確保它被重繪 。當它沒有連接到終端時,它通常是塊緩沖的(因此發生時資料仍在緩沖區中fork)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/525464.html
標籤:C共享内存
上一篇:fork子行程以信號0終止
