Linux c/c++之进程的创建

简介: 这篇文章介绍了在Linux环境下使用C/C++创建进程的三种方式:system函数、fork函数以及exec族函数,并展示了它们的代码示例和运行结果。

方式一: 使用system函数

特点: 当进程被创建之后,当前进程不再执行(处于挂起状态)

待被创建进程执行结束之后当前进程继续执行

被创建程序代码:

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>

int main(){
    printf("先休息再工作\n");
    sleep(5);
    for (int i = 0; i < 5; ++i)
    {
        printf("子进程pid:%d\n",getpid());
    }

    return 0;
}

运行结果:

创建子进程的代码:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main(){
    printf("先睡为敬!\n");
    sleep(3);
    printf("睡完了,干活儿!\n");
    system("./test.exe");
    printf("活儿干完了,继续睡!\n");
    sleep(5);
    printf("睡醒了,干饭,干饭\n");

    return 0;
}

运行结果:

方式二: 使用fork函数或vfork函数

特点: 如果当前进程为父进程,那么当父进程创建子进程之后,父子进程同时执行

fork函数创建子进程,子进程以拷贝父进程全部代码的方式来创建子进程并记录父进程的上下文(父进程运行到的位置), 父进程与子进程依据fork函数的返回值来区分

父进程fork函数返回子进程pid, 子进程fork函数返回0

代码:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main(){
    printf("这是父进程,父进程id:%d\n",getpid());

    sleep(3);

    printf("开始创建子进程--->\n");

    int ret = fork();
    int n = 0;
    if(ret){
        //父进程
        printf("这是父进程pid:%d\tret:%d\n",getpid(),ret);
        while(1){
            printf("父n-->:%d\n",n++);
            sleep(3);
        }
    }else{
        //子进程
        printf("这是子进程pid:%d\tret:%d\n",getpid(),ret);
        while(1){
            printf("子n-->:%d\n",n+=2);
            sleep(3);
        }
    }

    return 0;
}

结果:

示例: 父进程打印当前时间,子进程打印随机数

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
#include <time.h>

int main(){
    char userName[25]="student";
    char passWord[25]="123456";

    char user[25];
    char pass[25];

    while(1){
        printf("请输入用户名:");
        scanf("%s",user);
        printf("请输入密码:");
        scanf("%s",pass);
        if(0 == strcmp(user,userName) &&
           0 == strcmp(pass,passWord)){
               printf("登录成功!\n");
            break;
        }else{
            printf("输入错误,请重新输入!\n");
            sleep(2);
            system("clear");
        }
    }

    int ret = fork();
    if(ret){
        //父进程打印当前时间
        struct tm* pt = NULL;
        time_t tt;
        while(1){
            tt = time(NULL);
            pt = localtime(&tt);
            printf("时间: %02d:%02d:%02d\n",
            pt->tm_hour,pt->tm_min,pt->tm_sec);

            //间隔一秒循环一次
            sleep(1);
        }
    }else{
        //子进程打印随机数
        srand((unsigned int)time(NULL));
        while(1){
            printf("随机数----->%d\n",rand()%10000000);

            //间隔半秒循环一次
            usleep(500000);
        }

    }

    return 0;
}

结果:

由此可以说明,子进程与父进程是同时运行的

方式三: 使用exec簇

exec 族函数的特征:调用 exec 族函数会把新的程序装载到当前进程中. 在调用过 exec 族函数后,进程中执行的代码就与之前完全不同了,所以 exec 函数调用之后的代码是不会被执行的

相关文章
|
6天前
|
算法 Linux 调度
深入理解Linux操作系统的进程管理
本文旨在探讨Linux操作系统中的进程管理机制,包括进程的创建、执行、调度和终止等环节。通过对Linux内核中相关模块的分析,揭示其高效的进程管理策略,为开发者提供优化程序性能和资源利用率的参考。
25 1
|
1天前
|
SQL 运维 监控
南大通用GBase 8a MPP Cluster Linux端SQL进程监控工具
南大通用GBase 8a MPP Cluster Linux端SQL进程监控工具
|
9天前
|
运维 监控 Linux
Linux操作系统的守护进程与服务管理深度剖析####
本文作为一篇技术性文章,旨在深入探讨Linux操作系统中守护进程与服务管理的机制、工具及实践策略。不同于传统的摘要概述,本文将以“守护进程的生命周期”为核心线索,串联起Linux服务管理的各个方面,从守护进程的定义与特性出发,逐步深入到Systemd的工作原理、服务单元文件编写、服务状态管理以及故障排查技巧,为读者呈现一幅Linux服务管理的全景图。 ####
|
1月前
|
缓存 监控 Linux
linux进程管理万字详解!!!
本文档介绍了Linux系统中进程管理、系统负载监控、内存监控和磁盘监控的基本概念和常用命令。主要内容包括: 1. **进程管理**: - **进程介绍**:程序与进程的关系、进程的生命周期、查看进程号和父进程号的方法。 - **进程监控命令**:`ps`、`pstree`、`pidof`、`top`、`htop`、`lsof`等命令的使用方法和案例。 - **进程管理命令**:控制信号、`kill`、`pkill`、`killall`、前台和后台运行、`screen`、`nohup`等命令的使用方法和案例。
119 4
linux进程管理万字详解!!!
|
14天前
|
缓存 算法 Linux
Linux内核的心脏:深入理解进程调度器
本文探讨了Linux操作系统中至关重要的组成部分——进程调度器。通过分析其工作原理、调度算法以及在不同场景下的表现,揭示它是如何高效管理CPU资源,确保系统响应性和公平性的。本文旨在为读者提供一个清晰的视图,了解在多任务环境下,Linux是如何智能地分配处理器时间给各个进程的。
|
25天前
|
存储 运维 监控
深入Linux基础:文件系统与进程管理详解
深入Linux基础:文件系统与进程管理详解
64 8
|
22天前
|
网络协议 Linux 虚拟化
如何在 Linux 系统中查看进程的详细信息?
如何在 Linux 系统中查看进程的详细信息?
41 1
|
22天前
|
Linux
如何在 Linux 系统中查看进程占用的内存?
如何在 Linux 系统中查看进程占用的内存?
|
1月前
|
算法 Linux 定位技术
Linux内核中的进程调度算法解析####
【10月更文挑战第29天】 本文深入剖析了Linux操作系统的心脏——内核中至关重要的组成部分之一,即进程调度机制。不同于传统的摘要概述,我们将通过一段引人入胜的故事线来揭开进程调度算法的神秘面纱,展现其背后的精妙设计与复杂逻辑,让读者仿佛跟随一位虚拟的“进程侦探”,一步步探索Linux如何高效、公平地管理众多进程,确保系统资源的最优分配与利用。 ####
69 4
|
1月前
|
缓存 负载均衡 算法
Linux内核中的进程调度算法解析####
本文深入探讨了Linux操作系统核心组件之一——进程调度器,着重分析了其采用的CFS(完全公平调度器)算法。不同于传统摘要对研究背景、方法、结果和结论的概述,本文摘要将直接揭示CFS算法的核心优势及其在现代多核处理器环境下如何实现高效、公平的资源分配,同时简要提及该算法如何优化系统响应时间和吞吐量,为读者快速构建对Linux进程调度机制的认知框架。 ####