当前位置: 首页 > article >正文

Linux-----进程处理(子进程创建)

 【尚硅谷嵌入式Linux应用层开发,linux网络编程,linux进程线程,linux文件io】https://www.bilibili.com/video/BV1DJ4m1M77z?p=35&vd_source=342079de7c07f82982956aad8662b467

main函数

fork创建进程

fork()参数 

/**
 * @brief 创建一个子进程(相当于复制,包括内存空间)
 * void: 不需要填写参数
 *  
 * @return pid_t pid_t(int值) 
 *  (1) 在父进程中 返回子进程的PID
 *  (2) 在子进程中 返回0
 *  (3) 发生错误 返回-1
 */
pid_t fork(void);

getpid()   获取进程PID 

#include <sys/types.h>
#include <unistd.h>

/**
 * @brief 返回调用进程的PID
 * 
 * @return pid_t 不会失败,必然返回进程PID
 */
pid_t getpid(void);

 getppid()   获取父进程PID

#include <sys/types.h>
#include <unistd.h>

/**
 * @brief 返回调用进程父进程的PID
 * 
 * @return pid_t 不会失败,必然返回父进程PID,即PPID
 */
pid_t getppid(void);

代码案例

getpid()查看进程号

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>

int main(void) {

    //调用fork之前代码都是在父进进行的
    printf("君不见黄河之水天上来,奔流到海不复回_%d\n",getpid());


    // 使用fork创建子进程

    while (1)
    {
        /* code */
    }
    
    return 0;
}

fork()创建子进程

fork() 之后的代码都是在父子进程中各自执行一次的

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>

int main(void) {

    //调用fork之前代码都是在父进进行的
    printf("父进程PID:%d\n", getpid());
    


    // 使用fork创建子进程
    /* 不需要传参
    return int 进程号
    (1) -1出错
    (2) 父进程中表示子进程PID
    (3) 子进程中显示0
    */

    // fork() 之后的代码都是在父子进程中各自执行一次的
    pid_t pid = fork();
    printf("子进程PID:%d\n", pid);

    while (1)
    {
        /* code */
    }
    
    return 0;
}

条件判断使得父子进程执行各自对应的代码

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>

int main(void) {

    //调用fork之前代码都是在父进进行的
    printf("父进程PID:%d\n", getpid());
    
    // 使用fork创建子进程
    /* 不需要传参
    return int 进程号
    (1) -1出错
    (2) 父进程中表示子进程PID
    (3) 子进程中显示0
    */

    // fork() 之后的代码都是在父子进程中各自执行一次的
    pid_t pid = fork();
    // printf("子进程PID:%d\n", pid);

    if (pid < 0) {
        perror("getpid");
    }
    else if (pid==0)
    {
        printf("子进程:新的子进程:%d, 其父进程:%d\n", getpid(), getppid());
    }
    else {
        printf("父进程: 父进程%d,创建了进程%d\n", getpid(), pid);
    }

    while (1)
    {
        /* code */
    }
    
    return 0;
}


http://www.kler.cn/a/453470.html

相关文章:

  • c#中using语句
  • ArrayList源码解析
  • 论文阅读 - 《Large Language Models Are Zero-Shot Time Series Forecasters》
  • 常用的Django模板语言
  • Docker怎么关闭容器开机自启,批量好几个容器一起操作?
  • 强化特种作业管理,筑牢安全生产防线
  • Java项目中Oracle数据库开发过程中相关内容
  • AI绘图丨中国风 古典 产品展台电商场景第三弹(附关键词)
  • 路由策略
  • 学习C++:关键字
  • 每天40分玩转Django:Django静态文件
  • SLAM/数字图象处理基础
  • 【QT常用技术讲解】QTablewidget点击表头自动排序的两种方式
  • Map接口 及其 实现类(HashMap, TreeMap)
  • 基础组件:
  • MySQL为什么选择使用B+树作为索引结构?
  • 如何使用React,透传各类组件能力/属性?
  • python脚本:批量提取excel数据
  • WebRTC服务质量(10)- Pacer机制(02) RoundRobinPacketQueue
  • Unity自定义Inspector属性名特性以及特性自定义布局问题
  • 散户应该持有哪些代币?
  • 计算机网络 (8)物理层的传输方式
  • HashMap源码深度解析(JDK 1.8)
  • 鸿蒙项目云捐助第二十二讲云捐助项目物联网IoT鸿蒙端的代码实现
  • C 实现植物大战僵尸(一)
  • Mysql 查询性能调优总结