references:
[1] how to create two processes from a single Parent
[2] fork() in C
[3] linux中fork同时创建多个子进程的方法

fork的本质,就是复制,把当前进程复制一份,然后两个进程并发地执行fork后面的语句,区别就是,子进程的fork返回值是0,父进程的fork返回值是子进程的pid,这也是区分父进程和子进程的方法,至于其他的内容,在fork之前的东西两个进程的一样的。

给出一个父进程和一个子进程的模板

int fd = fork();
if(fd < 0){
	exit(1);
} else if(fd == 0){
	// child code
} else {
	// father code
}

对于创建1个父进程和2个子进程,也是一样的道理

int fd1,fd2;

fd1 = fork();
if(fd < 0){
	exit(1);
} else if(fd == 0){
	// child1 code
} else {
	fd2 = fork();
	if(fd2 < 0){
		exit(1);
	} else if(fd2 == 0){
		// child2 code
	} else {
		// father code
	}
}

先创建子进程1,然后父进程再继续执行,创建子进程2,最后,3个进程能够在框架内执行自己的代码。

这是最好用的框架,能够将3个进程都识别和区分开,不过如果创建n个子进程就会很麻烦。

因此,根据不同需求,也可以有别的写法

for(int i = 0; i < n; i++){
	int fd = fork();
	if(fd < 0){
		exit(1);
	} else if(fd == 0){
		// child i code
		break;
	} else {
		// father code
	}
}

最大作用的是break,保证子进程不会再进一步创建子进程。

然后其实子进程就可以干自己的事情了,比如执行个exec family,执行其他进程什么的。

另外值得一说的是,如果父进程没有等待子进程结束之后再结束的话,shell就会出现显示错乱。

就像下面这样,但是仅仅是显示错乱而已,你可以直接正常输入命令的。
在这里插入图片描述

reference
[1] Using fork() in simplest form need to hit enter to finish execution
[2] Why do shells call fork()?

至于为什么,那是因为,当shell执行命令的之后,也会先创建一个子shell,然后执行exec,再执行你想要执行的命令,执行结束后,再返回当前的shell。

我们用shell执行了父进程,结束后返回,就显示ss@ss:$了,而子进程仍然在执行,并且向shell输出了child process,所以就造成了上面的局面,但是仅仅是显示问题而已,正常向shell输入命令就好。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐