考虑这个例子(为简洁起见,我省略了头部和错误判断):

int main() {
    int fd;

    fd = open("dump", O_WRONLY | O_TRUNC | O_CREAT, S_IRUSR | S_IWUSR);

    if ( fork() > 0 ) {
        sleep(1);
        printf("Current offset: %li\n", (long)lseek(fd, 0, SEEK_CUR);
        write(fd, "zz", 2);
    }
    else {
        write(fd, "hello\n", 6);
    }

    close(fd);
    return 0;
}

此程序(在Linux上运行)打印

Current offset: 6

到航站楼,然后

hello
zz%

设置为dump(%表示缺少换行符).

为什么dump不包含

zzllo

My thinking is, after fork, there are two file descriptors to the same process but each with its own offset. Why does writing to one descriptor affect the other?

推荐答案

进程有自己的文件描述符,但这些描述符充当指向共享open-file descriptions的引用计数指针( for each open创建一个单独的打开文件描述).例如,通过共享打开文件描述,shell 脚本可以执行以下操作

(
 /usr/bin/echo hello
 /usr/bin/echo world 
) > some_file

并让some_file同时包含helloworld,而不会覆盖前者(就像它们不会(没有特别的努力)在向终端写信时互相覆盖一样).

它还允许应用程序修改终端设置(stty)、诸如flock之类的实用程序(在共享文件描述中设置锁),以及可能的其他内容.

C++相关问答推荐

Pure Win32 C(++)-除了替换控件的窗口程序之外,还有其他方法可以在输入时禁用按钮吗?

在C中使用动态内存分配找到最小的负数

当多个线程在C中写入相同的文件描述符时,如何防止争用情况?

为什么在函数内部分配内存空间时需要添加符号?

创建一个fork导致fget无限地重新读取文件

如何在C宏中确定 struct 中元素的类型?

在没有动态内存分配的情况下,用C语言最快地将各种数组复制到单个较大的数组中

仅在给定的大小和对齐方式下正确创建全局

试图从CSV文件中获取双精度值,但在C++中始终为空

不同出处的指针可以相等吗?

理解bzip2的BZ2_解压缩函数中的状态重新分配

如何在双向表中实现线程安全,每个条目仅使用4位,同时避免任何全局锁?

用C++构建和使用DLL的困惑

pthread_create的用法

如何在C中定义指向函数的指针并将该指针赋给函数?

将复合文字数组用作临时字符串缓冲区是否合理?

如何使用calloc和snprintf

如何使用WRITE()以指针地址的十六进制形式写入标准输出

是什么阻止编译器优化手写的 memcmp()?

将字节/字符序列写入标准输出的最简单形式