通过管道发送变量时丢失数据的风险?

时间:2015-04-22 17:42:27

标签: c process pipe

我有以下代码:

#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

1 个答案:

答案 0 :(得分:3)

虽然孩子的过程&#39;当进程退出时,内存会返回给操作系统,我怀疑这不是你真正要求的内容。

您更可能担心子进程退出后写入管道的数据会发生什么。正如pipe(2)手册页所述:

  

写入管道写端的数据由内核缓冲   直到从管道的读取端读取。

因此,即使编写它的进程已经退出,您的数据也会到达。