Linux进程控制——进程创建与退出

news2025/7/11 18:49:50
我们在用C语言结尾的时候总是会有return 0,但是有些人并不知道它到底有什么意思
还有在进程状态中让进程使用kill命令能够停下来,这些与进程控制有着密切的关系

1.进程的创建

fork函数能够在代码中创建一个子进程,我们创建子进程的目的就是为了让它完成不同的任务,我们现在需要创建多个子进程该怎么做呢?

 #include <stdio.h>
 #include <unistd.h>
 #include <stdlib.h>
 
 #define N 10
 
 void work()
 {
   int i = N;
   while(i--)
   {
     printf("我的id是:%d,我的父进程是:%d\n", getpid(), getppid());
     sleep(1);
   }
 }
 
 int main()
 {
   int i = 0;
   for(i = 0; i < N; i++)
   {
     pid_t id = fork();
     if(id != 0)
     {
       work();
       exit(0);                                                                     
     }
   }
 
 
   return 0;

我们可以看到这个代码的意思,父进程只进行创建子进程的循环,而子进程完成自己的工作后,就会退出,总共会有10个子进程,但是每个进程执行的任务应该是不一样的,那上面的代码还想也不太可以啊。所以:

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

#define N 10
typedef void (*func)();

void add()
{
  printf("6666666666666666666666666666666666666666666\n");
}

void work()
{
  int i = N;
  while(i--)
  {
    printf("我的id是:%d,我的父进程是:%d, %d\n", getpid(), getppid(), i);
    sleep(1);
  }
}

void child_process(int n, func f)
{

  int i = 0;
  for(i = 0; i < n; i++)
  {
    pid_t id = fork();
    if(id == 0)
    {
      printf("%d:我是一个子进程,我被创建了\n", i);
      f();                                                                                  
      exit(0);
    }
  }
}

int main()
{
  child_process(5, work);
  sleep(5);
  child_process(5, add);

  sleep(100);
  return 0;
}


在这里插入图片描述
可以看到这样的一种格式可以让某些任务做特定的事。而它的结果也更加反映了,进程的调度不单单是由优先级然后按顺序执行的,它有着更复杂的调度方式。

1.进程的退出

一般来说一个程序运行完后状态有三种:

1.代码运行完毕,结果正确
2.代码运行完毕,结果不正确
3.代码异常终止

而我们现在来讨论一下前两点。

1). 代码运行完毕

退出码

我们在使用C语言的时候,总是最后一句是return 0,而且我们也知道上面代码中的exit函数是用来终止一个进程的,它也有参数。而main函数return的返回值,和exit的参数,都是退出码。我们知道一个进程被创建出来是携带着任务的,那我们怎么知道它的任务是否完成了呢?作为用户来说我们或许可以通过显示器上的打印结果来判断这个进程的任务是否完成,而操作系统它就是由退出码来判断的。
在命令行我们可以通过echo $?来查看最近一次推出的进程的退出码。

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

int main()
{
  printf("hello world\n");
  return 0;                          
}

在这里插入图片描述

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

int main()
{
  printf("hello world\n");
  return 1;                       
}

在这里插入图片描述
对操作系统而言,退出的值0代表成功,非零代表失败。而非零的情况下,我们就可以根据不同的数值给出不同的错误原因,所以这就有了错误码的出现。

错误码

我们以前还学过一个码,错误码,它是一个常量errno,会捕获最近一次出错的的原因,然后返回对应的数值。它大概的意思就是,它会把最后一次调用系统调用函数或者标准库函数错误的信息存储在一个叫errno的变量里。
在这里插入图片描述
比如文件打开失败的判断。我们打开一个不存在的文件。

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

int main()
{
  FILE* pf = fopen("a.txt", "r");
  if(pf == NULL)
  {
    printf("%d:%s\n", errno, strerror(errno));
    return 1;                                            
  }
  return 0;
}

在这里插入图片描述
我们看到errno的值是2,对应的信息是没有文件或文件夹。
每个错误码都对应着一个错误信息:

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

int main()
{
  int i = 0;
  for(i = 0; i < 300; i++)
  {
    printf("%d:%s\n", i, strerror(i));                          
  }
  return 0;
}

在这里插入图片描述
在这里插入图片描述
我们看到总共有133个错误信息。而这我们也可以自己定义,也就是代码中添加个数组的事。
退出码和错误码的区别就是,退出码说明一个进程的退出原因,错误码是说明系统调用函数或库函数的调用情况

2). 代码异常终止

我们在Windows下运行代码的时候经常会遇到,突然就会弹出类似于这样一个框:

在这里插入图片描述

例如除以零,栈溢出,野指针的那种情况。
而在linux中野指针就是段错误:

int main()
{
  int* a = NULL;
  *a = 10;               
  return 0;
}

在这里插入图片描述
除以零是这种:

在这里插入图片描述
这种情况就是代码出异常,操作系统给进程发了个信号,让它以某种原因终止了。我们也知道Linux中的信号:
在这里插入图片描述
我们现在运行一个程序,然后用段错误的信号来终止它:
在这里插入图片描述
也说明了我们上面说的是正确的。
进程出异常,本质是进程收到了对应的信号,自己终止了,所以一个进程是否出异常,我们只要看有没有收到信号即可
一旦异常一般都是代码没跑完,退出码也就没有意义了
所以子进程退出的时候,父进程只需要知道两个数字即可

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1158057.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

电商课堂|5分钟了解电商数据分析完整流程,建议收藏!

账户效果下降&#xff0c;如何能够快速找到问题并优化调整&#xff1f; 相信百分之90%的竞价员都会说&#xff1a;“做数据分析。” 没错&#xff0c;数据分析能够帮助我们快速锁定问题所在&#xff0c;确定优化方向&#xff0c;还可以帮助我们找到流量控制的方向。那么做电商&…

绝地反击:阿里云服务器比腾讯云更优惠!

2023阿里云服务器优惠活动来了&#xff0c;以前一直是腾讯云比阿里云优惠&#xff0c;阿里云绝地反击&#xff0c;放开老用户购买资格&#xff0c;99元服务器老用户可以买&#xff0c;并且享受99元续费&#xff0c;阿腾云亲测可行&#xff0c;大家抓紧吧&#xff0c;数量不多&a…

软信天成:智能数据治理解决方案-干货分享

近年来&#xff0c;数据治理成为备受关注的焦点&#xff0c;越来越多的企业和组织开始注重数据治理&#xff0c;以更好地保护和管理数据。为助力企业有效开展数据治理工作&#xff0c;软信天成基于过往实施案例&#xff0c;梳理出有关数据治理实施的关键要素和心得&#xff0c;…

Techlink TL24G06 网络变压器 10G 基座单端口变压器

功能特征&#xff1a; 1、符合IEEE 802.3标准。 2、符合RoHS。 3、工作温度范围&#xff1a;0C至70C。 4、储存温度范围&#xff1a;-20C至125C。

Java实现对Html文本的处理

1.引入jsoup <dependency><groupId>org.jsoup</groupId><artifactId>jsoup</artifactId><version>1.8.3</version> </dependency> 2. html示例 示例代码&#xff1a; <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1…

EG4003-一颗为微波、红外信号放大及处理输出的数模混合芯片

产品描述&#xff1a; EG4003是一款特意为微波、红外信号放大及处理输出的数模混合芯片&#xff0c;内部集成了运算放大器、双门限电压比较器、参考电压源、延时时间定时器和封锁时间定时器及状态控制器等&#xff0c;专用于防盗报警系统、人体门控制装置、照明控制开关等场合。…

C# 通过Costura.Fody把DLL合并到exe程序中

打包独立的exe程序有多种方法&#xff0c;这里只说Costura.Fody。 我们用VS发布应用程序可以借助Costura.Fody直接打包成一个独立的exe程序&#xff0c;但是一些非托管的做了几次都没打进去&#xff0c;最后成功了&#xff0c;这里记录一下。 首先安装Costura.Fody 或者可以通…

华为OD机试 - 统计射击比赛成绩 - 逻辑分析(Java 2023 B卷 100分)

目录 专栏导读一、题目描述二、输入描述三、输出描述四、解题思路五、Java算法源码六、效果展示1、输入2、输出3、说明 华为OD机试 2023B卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;A卷B卷&#…

【金银钻思】

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

ScrapeKit库中Swift爬虫程序写一段代码

以下是一个使用ScrapeKit库的Swift爬虫程序&#xff0c;用于爬取网页视频的代码&#xff1a; import ScrapeKit// 创建一个配置对象&#xff0c;用于指定爬虫ip服务器信息 let config Configuration(proxyHost: "duoip", proxyPort: 8000)// 创建一个爬虫对象 let s…

Linux新加硬盘的挂载方法

1、首先查看当前硬盘所属的分区 sudo fdisk -lu 可以看到我们新加的盘&#xff1a; 接下来&#xff0c;对这个盘进行格式化&#xff1a; sudo mkfs -t ext4 /dev/sda 特别提醒&#xff1a; 这里的 /dev/sda 是你新挂载的盘符&#xff0c;一定不能搞错&#xff0c;不然就可能造…

Vue3.0 reactive与ref VCA模式

简介 Vue3 最大的一个变动应该就是推出了 CompositionAPI&#xff0c;可以说它受ReactHook 启发而来&#xff1b;它我们编写逻辑更灵活&#xff0c;便于提取公共逻辑&#xff0c;代码的复用率得到了提高&#xff0c;也不用再使用 mixin 担心命名冲突的问题。 ref 与 reactive…

高尔夫代码

在高尔夫游戏中&#xff0c;每个洞都有自己的标准杆数par&#xff0c;意思是一个高尔夫球员为了把球打进洞里完成比赛&#xff0c;预计要挥杆的平均次数 strokes。 根据你把球打进洞所挥杆的次数 strokes 高于或低于 par 多少&#xff0c;有一个不同的昵称&#xff08;代表打高…

已经安装了pandas库,但仍然遇到导入错误

已经安装了pandas库&#xff0c;但仍然遇到导入错误&#xff0c;可能是因为你的开发环境没有正确配置或没有选中正确的Python解释器。 报错内容&#xff1a; [{"resource": "/D:/Desktop/01.py","owner": "_generated_diagnostic_collect…

Find My移动硬盘|苹果Find My技术与移动硬盘结合,智能防丢,全球定位

当今已经是数据的时代&#xff0c;各种东西需要保存下来的很多&#xff0c;电脑、手机等设备更换频率也快&#xff0c;确实每个人都需要一个自己的"数据库"&#xff0c;而移动硬盘无疑是最有性价比、最简单使用的选择。移动硬盘一直是我们生活中不可或缺的存储工具&a…

2023最新ChatGPT商业运营系统源码+支持GPT4/支持ai绘画+支持Midjourney绘画

一、AI创作系统 SparkAi创作系统是基于OpenAI很火的ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统&#xff0c;支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如…

鼠标移动的提示框

<template><div><!-- 提示框 --><div class"float-tip" :show"floatTipData.show" :style"floatTipData.style">{{ floatTipData.text }}</div><!-- 移入某个元素触发显示跟随提示框显示--><div class&q…

206.反转链表

206.反转链表 力扣题目链接(opens new window) 题意&#xff1a;反转一个单链表。 示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL 双双指针法&#xff1a; 创建三个节点 pre(反转时的第一个节点)、cur(当前指向需要反转的节点…

云原生环境下JAVA应用容器JVM内存如何配置?—— 筑梦之路

Docker环境下的JVM参数非定值配置 —— 筑梦之路_docker jvm设置-CSDN博客 之前简单地记录过一篇&#xff0c;这里在之前的基础上更加细化一下。 场景说明 使用Java开发且设置的JVM堆空间过小时&#xff0c;程序会出现系统内存不足OOM&#xff08;Out of Memory&#xff09;的…

『第十二章』数据持久化:SwiftData

在本篇博文中,您将学到如下内容: 1. 全新的 SwiftData2. SwiftData 的组成SwiftData 数据模型3. SwiftData 数据模型与增删改查操作4. 双剑合璧:SwiftData 与 SwiftUI总结梦后楼台高锁,酒醒帘幕低垂。 去年春恨却来时。 落花人独立,微雨燕双飞。 记得小蘋初见,两重心字罗衣…