Linux使用fork()方法创建进程

简介: Linux使用fork()方法创建进程

在做操作系统的实验过程中,自己安装了Ubuntu(18.04.1)64位,在这里给大家安利一个VX公众号:软件安装管家。这里真的有好多好多的软件,非常全面并且安装教程非常详细,强烈推荐!!!


在此声明,我所有代码都是基于Ubuntu(18.04.1)64位,使用vim编辑器编辑,gcc编译的。兼容性不知道如何。因为自己也是linux新人,难免有一些不太准确的地方,还希望和兄弟们交流学习。


实验应该是要验证进程之间的并发性,就是输出字符的顺序是不一定的,但是也许是由于代码太简单的缘故,导致输出顺序每次都是固定的。。很是尴尬

#include<unistd.h>
#include<string.h>
#include<stdlib.h>
#include<stdio.h>
int main()
{
        pid_t pid1,pid2;
        pid1 = fork();//创建一个新process
        if(pid1 < 0)
        {
                printf("创建进程失败!");
                exit(1);
        }
        else if(pid1 == 0)
        {
               printf("b");
        }
        else
        {
                pid2 = fork();//创建第二个新进程
                if(pid2 < 0)
                {
                        printf("进程创建失败!");
                        exit(1);
                }
                else if(pid2 == 0)
                {
                        printf("c");
                }
                else
              {
                        printf("a");
                }
        }
        //getchar();//如果运行错行,再放开此句,拦住父进程,不让其结束
        return 0;
}

更尴尬的是,这个代码的运行结果:

image.png


a居然打印在了那个地方???小弟刚开始接触linux,人都傻了,这是因为主进程直接结束,它运行速度甚至快于终端输出??


我试着在代码尾部加了getchar()拦截一下主进程:

image.png

这下输出就舒服多了。。。但是我运行了很多遍,顺序都是这样,所以就改成for循环来打印,在每个进程执行过程中,用for循环打印数据。

#include<unistd.h>
#include<string.h>
#include<stdlib.h>
#include<stdio.h>
int main()
{
        pid_t pid1,pid2;
        pid1 = fork();//创建一个新process
        if(pid1 < 0)
        {
                printf("创建进程失败!");
                exit(1);
        }
        else if(pid1 == 0)
        {
        for(int i = 0;i<1000;i++)
      {
        printf("b  子进程1的标识符是%d",getpid());
      }              
        }
        else
        {
                pid2 = fork();//创建第二个新进程
                if(pid2 < 0)
                {
                        printf("进程创建失败!");
                        exit(1);
                }
                else if(pid2 == 0)
                {
          for(int i = 0;i<1000;i++)
          {
            printf("c  子进程2的标识符是%d",getpid());
          }
          }   
          else
        {
          for(int i = 0;i<1000;i++)
          {
            printf("a  父进程的标识符是%d",getpid());
          } 
            } 
        }
        getchar();//为了拦住进程,不让进程结束
        return 0;
}

运行结果:

image.png

交叉打印,感觉有那味了,并发执行。

接下来又要求给进程上锁,使用lockf()函数,这个原理基本就和Windows的临界区是一个概念,申请到锁的资源才可以执行,并且在释放资源之前,不会被其他进程抢占这个资源,实现了进程间同步机制。


附上代码以及截图:

#include<unistd.h>
#include<string.h>
#include<stdlib.h>
#include<stdio.h>
int main()
{
        pid_t pid1,pid2;
        pid1 = fork();//创建一个新process
        if(pid1 < 0)
        {
                printf("创建进程失败!");
                exit(1);
        }
        else if(pid1 == 0)
        {
                lockf(1,1,0);//上锁
                for(int i = 0;i<100;i++)
                {
                        printf("Chile_1  子进程1标识是%d\r\n",getpid());
                }
                lockf(1,0,0);//解锁
        }
        else
        {
                pid2 = fork();//创建第二个新进程
                if(pid2 < 0)
                {
                        printf("进程创建失败!");
                        exit(1);
                }
                else if(pid2 == 0)
                {
                        lockf(1,1,0);//上锁
                        for(int i = 0;i<100;i++)
                        {
                                printf("Child_2  子进程2标识是%d\r\n",getpid());
                        }
                        lockf(1,0,0);//解锁
                }
                else
                {
                        lockf(1,1,0);//上锁
                        for(int i = 0;i<100;i++)
                        {
                                printf("FatherProcess 父进程标识是%d\r\n",getpid());
                        }
                        lockf(1,0,0);//解锁
                }
        }
        getchar();//为了拦住进程,不让进程结束
        getchar();
        return 0;
}

image.png


image.png


image.png


目录
相关文章
|
21天前
|
算法 Linux 调度
深入理解Linux操作系统的进程管理
本文旨在探讨Linux操作系统中的进程管理机制,包括进程的创建、执行、调度和终止等环节。通过对Linux内核中相关模块的分析,揭示其高效的进程管理策略,为开发者提供优化程序性能和资源利用率的参考。
47 1
|
9天前
|
存储 监控 Linux
嵌入式Linux系统编程 — 5.3 times、clock函数获取进程时间
在嵌入式Linux系统编程中,`times`和 `clock`函数是获取进程时间的两个重要工具。`times`函数提供了更详细的进程和子进程时间信息,而 `clock`函数则提供了更简单的处理器时间获取方法。根据具体需求选择合适的函数,可以更有效地进行性能分析和资源管理。通过本文的介绍,希望能帮助您更好地理解和使用这两个函数,提高嵌入式系统编程的效率和效果。
62 13
|
16天前
|
SQL 运维 监控
南大通用GBase 8a MPP Cluster Linux端SQL进程监控工具
南大通用GBase 8a MPP Cluster Linux端SQL进程监控工具
|
24天前
|
运维 监控 Linux
Linux操作系统的守护进程与服务管理深度剖析####
本文作为一篇技术性文章,旨在深入探讨Linux操作系统中守护进程与服务管理的机制、工具及实践策略。不同于传统的摘要概述,本文将以“守护进程的生命周期”为核心线索,串联起Linux服务管理的各个方面,从守护进程的定义与特性出发,逐步深入到Systemd的工作原理、服务单元文件编写、服务状态管理以及故障排查技巧,为读者呈现一幅Linux服务管理的全景图。 ####
|
29天前
|
缓存 算法 Linux
Linux内核的心脏:深入理解进程调度器
本文探讨了Linux操作系统中至关重要的组成部分——进程调度器。通过分析其工作原理、调度算法以及在不同场景下的表现,揭示它是如何高效管理CPU资源,确保系统响应性和公平性的。本文旨在为读者提供一个清晰的视图,了解在多任务环境下,Linux是如何智能地分配处理器时间给各个进程的。
|
1月前
|
网络协议 Linux 虚拟化
如何在 Linux 系统中查看进程的详细信息?
如何在 Linux 系统中查看进程的详细信息?
93 1
|
1月前
|
Linux
如何在 Linux 系统中查看进程占用的内存?
如何在 Linux 系统中查看进程占用的内存?
|
5月前
|
运维 关系型数据库 MySQL
掌握taskset:优化你的Linux进程,提升系统性能
在多核处理器成为现代计算标准的今天,运维人员和性能调优人员面临着如何有效利用这些处理能力的挑战。优化进程运行的位置不仅可以提高性能,还能更好地管理和分配系统资源。 其中,taskset命令是一个强大的工具,它允许管理员将进程绑定到特定的CPU核心,减少上下文切换的开销,从而提升整体效率。
掌握taskset:优化你的Linux进程,提升系统性能
|
5月前
|
弹性计算 Linux 区块链
Linux系统CPU异常占用(minerd 、tplink等挖矿进程)
Linux系统CPU异常占用(minerd 、tplink等挖矿进程)
192 4
Linux系统CPU异常占用(minerd 、tplink等挖矿进程)
|
4月前
|
算法 Linux 调度
探索进程调度:Linux内核中的完全公平调度器
【8月更文挑战第2天】在操作系统的心脏——内核中,进程调度算法扮演着至关重要的角色。本文将深入探讨Linux内核中的完全公平调度器(Completely Fair Scheduler, CFS),一个旨在提供公平时间分配给所有进程的调度器。我们将通过代码示例,理解CFS如何管理运行队列、选择下一个运行进程以及如何对实时负载进行响应。文章将揭示CFS的设计哲学,并展示其如何在现代多任务计算环境中实现高效的资源分配。