Linux下创建进程简介

短命女 2022-12-12 13:49 273阅读 0赞

在博文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来与它的子进程同步。

以下是测试代码段:

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

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

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2ZlbmdiaW5nY2h1bg_size_16_color_FFFFFF_t_70

  1. void test_fork_2()
  2. {
  3. // reference: https://www.geeksforgeeks.org/fork-system-call/
  4. pid_t f = fork();
  5. // child process because return value zero
  6. if (f == 0) {
  7. fprintf(stdout, "hello from child: parent pid: %d, my(child) pid: %d\n", getppid(), getpid());
  8. }
  9. // parent process because return value non-zero
  10. else if (f > 0) {
  11. fprintf(stdout, "hello from parent: my(parent) pid: %d\n", getpid());
  12. } else {
  13. fprintf(stderr, "unable to create child process\n");
  14. }
  15. }

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

20201007130243169.png

GitHub:https://github.com/fengbingchun/Messy_Test

发表评论

表情:
评论列表 (有 0 条评论,273人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Windows创建进程简介

    正在执行的应用程序称为进程,进程不仅仅是指令和数据,它还有状态。状态是保存在处理器寄存器中的一组值,如当前执行指令的地址、保存在内存中的值,以及唯一定义进程在任一时刻任务的所有

    相关 Linux进程简介

    在一台服务器上面看到有如下这么多类似的进程:     2 root      20   0     0    0    0 S    0  0.0   0:00.00 kth

    相关 linux 进程创建 进程启动 监控

    0x00 简介 在入侵检测的过程中,进程创建监控是必不可少的一点,因为攻击者的绝大多数攻击行为都是以进程的方式呈现,所以及时获取到新进程创建的信息能帮助我们快速地定位攻击行为