Linux下创建进程简介

本文介绍了Linux系统中使用fork函数创建进程的过程,包括fork函数如何复制父进程的内存并返回不同值以区分父进程和子进程。通过示例代码展示了fork调用多次后进程的创建情况,并解释了父子进程的同步机制。测试代码演示了fork调用后的输出行为。
摘要由CSDN通过智能技术生成

在博文https://blog.csdn.net/fengbingchun/article/details/108940548中简单介绍了Windows下通过函数CreateProcess创建进程的过程,这里简单介绍下Linux下通过fork函数创建进程的过程。很早之前在https://blog.csdn.net/fengbingchun/article/details/45690745中也曾介绍过。

进程创建的UNIX模型为分叉----执行(fork----exec)模型。fork函数调用生成一个完全复制父进程内存的子进程。exec函数调用以一个新的可执行文件替换当前进程。这两个调用通常一起使用,这样应用程序可调用fork函数创建一个新进程,然后该子进程直接调用exec函数以一个新的可执行文件替换自身。如果fork调用后面不跟exec调用,我们将有同一进程的两个副本。到进行分叉调用时这两个进程的进程状态是一样的。

子进程和父进程都会从fork函数调用返回,唯一的区别在于调用的返回值。子进程将返回零值,父进程将返回子进程的进程ID。fork函数不带任何参数,并返回一个整数值,返回负值,表示创建子进程失败。子进程和父进程在单独的内存空间中运行。子进程具有自己唯一的进程ID。子进程不会继承其父进程的内存锁。调用一次fork,却能够返回两次返回值,在子进程中,fork函数返回0,在父进程中,fork函数返回新创建子进程的进程ID。我们可以通过fork返回值来判断当前进程是子进程还是父进程。两个进程执行没有固定的先后顺序,哪个进程先执行要看系统的进程调动策略。一个进程通过调用wait来与它的子进程同步。

以下是测试代码段:

void test_fork_1()
{
	// reference: https://www.geeksforgeeks.org/fork-system-call/
	fork();
	fork();
	fork();
	// "hello"的打印次数等于创建的进程数,进程总数为2^n,其中n是fork调用的数目
	fprintf(stdout, "hello\n"); // 注:总共会输出8次hello
}

test_fork_1():总共会输出8次”hello”。”hello”的打印次数等于创建的进程数,进程总数为2^n,其中n是fork调用的数目。8次”hello”=1个主进程+7个子进程。执行结果如下图所示:

void test_fork_2()
{
	// reference: https://www.geeksforgeeks.org/fork-system-call/
	pid_t f = fork();

	// child process because return value zero
	if (f == 0) {
		fprintf(stdout, "hello from child: parent pid: %d, my(child) pid: %d\n", getppid(), getpid());
	}
	// parent process because return value non-zero
	else if (f > 0) {
		fprintf(stdout,	"hello from parent: my(parent) pid: %d\n", getpid());
	} else {
		fprintf(stderr, "unable to create child process\n");
	}
}

test_fork_2():”hello from child”和”hello from parent”两个输出是可能的,因为父进程和子进程同时运行。因此,我们不知道操作系统是先将控制权交给父进程还是子进程。父进程和子进程正在运行同一程序,但这并不意味着它们是相同的。操作系统为这两个进程分配不同的数据和状态,并且这些进程的控制流可以不同。执行结果如下图所示:

GitHubhttps://github.com/fengbingchun/Messy_Test

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值