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 codebreak;} 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输入命令就好。