我有以下代碼:通過管道發送變量時會丟失數據的風險?
#include <unistd.h>
#include <stdio.h>
#include <sys/wait.h>
#include <sys/types.h> // may not be needed
#include <sys/stat.h> // may not be needed
#include <stdlib.h>
#include <string.h>
typedef struct {
int pid;
char arg[100];
int nr;
} Str;
int main() {
int c2p[2];
pipe(c2p);
int f = fork();
if (f == 0) {
Str s;
s.pid = 1234;
strcpy(s.arg, "abcdef");
s.nr = 1;
close(c2p[0]);
write(c2p[1], &s, sizeof(Str));
close(c2p[1]);
exit(0);
}
wait(0);
close(c2p[1]);
Str s;
read(c2p[0], &s, sizeof(Str));
printf("pid: %d nr: %d arg: %s", s.pid, s.nr, s.arg);
close(c2p[0]);
return 0;
}
我不得不說,它的工作只是罰款,直至現在(PID,NR和Arg從未改變),但:
當孩子過程完成後,是由孩子使用的內存段(被標記爲空閒)? 如果是這樣,那麼在書寫時間和閱讀時間之間是否存在失去對該段的訪問或要改變的數據的風險?
(原來的問題是這樣的:Sending structure through pipe without losing data)
檢查您所做圖書館電話的結果可能是值得的,因爲根據這些結果採取行動。當子進程完成時,它的記憶自然也消失了。但不要認爲管道上寫的數據也是如此。這個管道仍然有一個優秀的讀取句柄(和寫入句柄,因爲這個問題),因爲你沒有關閉父進程write-side,直到你的wait()之後。 – WhozCraig