Linux进程编程4——父子进程对文件的操作

以下内容源于网络资源的学习与整理,如有侵权请告知删除。

1、子进程继承父进程中打开的文件

(1)上下文:父进程先用open打开一个文件得到fd,然后再fork创建子进程,之后在父子进程中各自write向fd中写入内容。

(2)测试结论是接续写

  • 因为父子进程之间的fd对应的文件指针是彼此关联的(很像O_APPEND标志后的样子)。

(3)实际测试时有时候会看到只有一个,有点像分别写。但是实际不是,原因是见第2点。

2、父子进程各自独立打开同一文件实现共享

(1)父进程open打开1.txt然后写入,子进程打开1.txt然后写入。

  • 结论是分别写。
  • 原因是父子进程分离后,才各自打开1.txt,此时这两个进程的PCB已经独立了,文件表也独立了,因此2次读写是完全独立的。

(2)open时使用O_APPEND标志会如何?

  • 实际测试结果表明,O_APPEND标志可以把父子进程各自独立打开的fd的文件指针给关联起来,实现接续写。

3、总结

(1)父子进程间终究多了一些牵绊;

(2)父进程(在没有fork之前)做的事情对子进程有很大影响,但是父进程(fork之后)在 if 里做的事情就对子进程没有影响了。

  • 因为fork已经复制父进程的PCB生成了一个新的子进程,并且fork返回时子进程已经完全和父进程脱离,并且独立被OS调度执行。

(3)子进程最终目的是要独立运行另外的程序。

附代码

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>

int main(void)
{
	// 首先打开一个文件
	int fd = -1;
	pid_t pid = -1;
	
	// fork创建子进程
	pid = fork();
	if (pid > 0)
	{
		// 父进程中
		fd = open("1.txt", O_RDWR | O_APPEND);
		if (fd < 0)
		{
			perror("open");
			return -1;
		}
		
		printf("parent.\n");
		write(fd, "hello", 5);
		sleep(1);
	}
	else if (pid == 0)
	{
		// 子进程
		fd = open("1.txt", O_RDWR | O_APPEND);
		if (fd < 0)
		{
			perror("open");
			return -1;
		}
		
		printf("child.\n");
		write(fd, "world", 5);
		sleep(1);//这里的sleep是防止其中一个进程结束后,另外一个进程还没有写,文件就close了。
	}
	else
	{
		perror("fork");
		exit(-1);
	}
	close(fd);
	
	
/*
	// 首先打开一个文件
	int fd = -1;
	pid_t pid = -1;
	
	fd = open("1.txt", O_RDWR | O_TRUNC);
	if (fd < 0)
	{
		perror("open");
		return -1;
	}
	
	// fork创建子进程
	pid = fork();
	if (pid > 0)
	{
		// 父进程中
		printf("parent.\n");
		write(fd, "hello", 5);
		sleep(1);
	}
	else if (pid == 0)
	{
		// 子进程
		printf("child.\n");
		write(fd, "world", 5);
		sleep(1);
	}
	else
	{
		perror("fork");
		exit(-1);
	}
	close(fd);
*/	
	return 0;
}

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: Linux进程编程是指在Linux操作系统下,使用多个进程同时执行任务的编程方式。 在Linux中,每个进程都是一个独立的执行环境,有自己独立的地址空间和资源。多进程编程可以通过创建多个进程来同时执行不同的任务,从而提高程序的并发性和效率。 在Linux中,可以使用fork()系统调用创建一个新的进程。原有进程称为进程,新创建的进程称为子进程进程子进程具有相同的代码段和数据段,但拥有不同的进程ID。 通过fork()创建的进程在执行时,复制进程的所有资源,包括打开文件文件描述符等。子进程独立于进程运行,并且可以通过exec()系列函数来加载新的程序,替代原有的代码段和数据段,实现不同的任务。 多进程编程可以通过子进程间的通信来实现数据交换。常用的通信方式包括管道、共享内存、信号和套接字等。进程可以通过管道或共享内存将数据传递给子进程子进程可以通过套接字与其他进程进行通信,实现进程间的数据共享和同步。 多进程编程也需要注意避免进程之间的竞争条件和死锁。可以使用进程同步机制,如互斥锁和信号量,来保证多个进程对共享资源的互斥访问和同步执行。 总而言之,Linux进程编程是一种有效利用多核处理器和提高程序并发性的编程方式,可以通过创建多个进程来同时执行不同的任务,并通过不同的进程间通信方式来实现数据交换和同步执行。 ### 回答2: Linux进程编程是指在Linux操作系统使用多个进程同时执行任务的编程方式。 Linux作为一个多用户、多任务的操作系统,支持多进程的并行执行。多进程编程可以充分利用操作系统提供的资源管理和调度机制,实现并发性和并行性。 在Linux中,一个程序可以通过创建新的进程来执行不同的任务。多进程编程可以通过调用系统调用fork()创建新的进程,从而将任务分配给不同的进程执行。同时,通过调用系统调用exec()可以在子进程中加载新的程序代码,实现任务的切换和执行。 多进程编程可以实现任务的分割和并行化处理,提高了程序的执行效率和响应速度。不同的进程之间可以通过进程间通信(IPC)机制来进行数据的交换和协调,如管道、信号、共享内存等。 在多进程编程中,需要注意进程的创建和销毁、进程间通信的机制、进程间的同步与互斥等问题。合理使用进程编程可以更好地利用多核处理器的计算能力和资源,提高程序的并发性和性能。 总之,Linux进程编程是一种高效利用操作系统资源的编程方式,可以实现任务的并行处理,提高程序的执行效率和响应速度。 ### 回答3: Linux进程编程是指在Linux操作系统使用多个进程进行编程的一种方法。在Linux下,可以创建多个进程来同时执行不同的任务,扩展系统的处理能力,提高整体的效率和响应速度。 多进程编程的主要特点是可以实现并发执行,每个进程独立运行,相互之间不相互干扰。在Linux中,可以使用fork()系统调用来创建新的进程子进程的运行和进程是并行的。子进程可以继承进程的资源,如打开文件描述符、信号处理等,也可以通过exec()系列系统调用来加载新的程序,实现进程的替换。 在多进程编程中,进程之间可以通过进程间通信(IPC)方式进行数据交换和同步。常用的IPC机制有管道、共享内存、消息队列和信号量等。这些机制可以让多个进程之间传递数据、共享资源,实现各个进程之间的协作和通信。 多进程编程还可以通过进程管理和调度来控制各个进程的执行顺序和优先级,提高系统的整体性能。Linux提供了丰富的进程管理工具和调度算法,可以根据实际需求进行调整和配置,以达到最佳的性能和资源利用率。 总之,Linux进程编程是一种高效的编程模式,可以充分利用多核处理器的优势,实现并发执行和资源共享。它不仅可以提高系统的处理能力和响应速度,还可以提高系统的稳定性和可靠性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天糊土

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值