Linux文件共享(四)——父进程与子进程之间的文件共享

注:转载请注明出处    作者:lvyilong316

fork产生的进程为子进程。fork的一个特性是父进程所有的打开文件描述符file_struct都被复制到子进程中,父子进程的每个相同的打开描述符共享一个文件表项如图


linux系统中的具体实现可用下图表示(说明:进程的fs_struct也会被复制,图中没有画出)。


这种共享的方式使父、子进程对同一个文件使用了同一个文件偏移量。如果父、子进程写到同一个文件描述符,但有没有任何形式的同步,那么它们的输出就会相互混合。在fork之后处理文件描述符有两种常见的情况:

1)父进程等待子进程完成。在这种情况下,父进程无须对其描述符做任何处理。当子进程终止之后,它曾进行过读、写的人一个共享描述符的文件偏移量已经执行了相应的更新。

2)父、子进程各自执行不同的程序段。这种情况下,在fork之后,父、子进程各自关闭它们不需使用的文件描述符,这样就不会干扰对方使用的文件描述符。这种方式是网络服务进程中常用的方式。

总结:父子进程共享“文件表项”(file对象),同dup一样,这会增加“文件达开计数”(file对象的引用计数),只不过fork增加的引用计数来自不同进程(父进程和子进程)中的描述符,dup增加的引用来自同一文件描述符。但父子进程独立运行后再打开的文件就不在共享file对象,这个两个独立进程打开文件情况一样。父子进程传递文件描述符和两独立进程传递描述符性质一样。

注:文件表项只有在所有引用它的fd(即文件描述符)全部关闭的情况下才会真正关闭。所以如上述情况,如果子进程关闭父、子进程共享的文件描述符后父进程仍可以使用对应的文件表项。

### Linux父进程子进程的概念 在Linux系统中,进程被定义为程序的一次执行过程,具备动态性和并发性的特性[^3]。每当一个新进程被创建时,该进程会有一个唯一的标识符——PID(Process ID),并且每个进程都有一个对应的父进程ID(PPID)。当提到父进程子进程的关系时: - **父进程**是指那些通过特定方式创建了另一个进程的进程。例如,在用户登录到系统之后,`systemd` 或 `init` 创建了一个新的 `bash` 进程作为当前用户的交互shell,这个`bash` 就成为了用户下所有后续启动进程的初始父进程[^2]。 - **子进程**则是指由某个现有进程所创建的新进程实例。通常情况下,子进程是由其父进程利用诸如 `fork()` 系统调用来复制自己而产生的副本;此时,子进程中几乎包含了父进程相同的数据结构,但拥有独立的内存空间以及不同的 PID 和 PPID 值[^1]。 #### 关系说明 子进程之间存在紧密联系的同时也保持相对独立的状态。具体表现在以下几个方面: - **资源共享**:尽管两者共享某些属性如文件描述符、工作目录等,但是它们各自维护着一套完整的上下文信息,比如寄存器内容、堆栈指针等等。这意味着即使是在同一时刻读取相同的全局变量,两个进程也会得到各自的拷贝而不是互相干扰的结果。 - **通信机制**:为了实现必要的协作功能,Linux 提供了一系列用于进程间通讯的方法(IPC), 包括信号量(semaphore)、消息队列(message queue)、管道(pipe)等形式。此外,环境变量也是常见的跨代传递手段之一,因为父进程设置好的环境配置能够自然地传给它的每一个后代成员[^4]。 - **生命周期管理**:一旦子进程完成任务并终止,则它不会立即消失而是进入僵尸(zombie)状态等待回收。这时只有父进程有权对其进行清理操作(通常是通过 wait() 函数家族来获取退出码); 如果父进程先于子进程结束的话, 那么孤儿(orphaned)子进程将会被 init (PID=1)接管直至正常关闭为止。 ```c #include <stdio.h> #include <unistd.h> int main(){ pid_t child_pid; printf("Parent process starting\n"); child_pid = fork(); // Create a new process if(child_pid != 0){ // Parent Process Code Block sleep(5); printf("This is the parent process.\n"); }else{ // Child Process Code Block printf("This is the child process.\n"); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值