Linux下创建进程简介
在博文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”两个输出是可能的,因为父进程和子进程同时运行。因此,我们不知道操作系统是先将控制权交给父进程还是子进程。父进程和子进程正在运行同一程序,但这并不意味着它们是相同的。操作系统为这两个进程分配不同的数据和状态,并且这些进程的控制流可以不同。执行结果如下图所示:
GitHub:https://github.com/fengbingchun/Messy_Test
还没有评论,来说两句吧...