Linux--进程控制

进程终止

进程终止是指一个正在运行的进程结束其执行并释放占用的系统资源的过程。进程可以通过以下几种方式终止:

正常终止 :进程完成了它的任务,或者遇到了终止条件,例如调用了exit()函数或主函数执行完毕。
异常终止 :进程可能会遇到一些异常情况,例如访问非法内存、发生除零错误等。操作系统会接收到这些异常,并强制终止进程。
被其他进程终止 :另一个进程可以发送信号给目标进程,要求其终止。例如,在命令行中使用kill命令终止特定进程。
系统终止:操作系统可能需要终止某些进程以保护系统的稳定性,例如当系统资源不足时。

在进程终止时,操作系统会回收已分配给该进程的内存空间、文件描述符、打开的文件等资源,并将进程的退出状态返回给父进程。

自定义退出码

c 复制代码
enum{
   success=0,
  open_err,                                                                                                   
  malloc_err 
};

const char* errorToDesc(int code)
{
  switch(code)
  {
    case success:
      return "success";
    case open_err:
      return "file open error";
    case malloc_err:
      return "malloc error";
    default:
      return "unknown error";
                                                                                                              
  }
}

 int Print()
{
  printf("hello Linux\n");
  printf("hello Linux\n");
  printf("hello Linux\n");
  printf("hello Linux\n");
  return 0;
}
int main()
{
 int n=Print();
  printf("n=%d\n",n);
  int code=malloc_err;
  printf("%s\n",errorToDesc(code));
  return 0;
}



打印出退出码表示的含义

举例:

exit()和_exit()

exit()和_exit()都是用于正常终止进程的函数



进程等待

进程等待指的是一个进程暂停其执行,直到满足某个条件或事件发生后才会继续执行。在操作系统中,进程可以通过等待来同步和协调与其他进程的操作。

wait

在Linux中,wait()是一个系统调用,是父进程在等待子进程执行完毕之前挂起自身,并等待子进程的终止状态。

父进程可以使用wait()等待子进程的终止。当父进程调用wait()时,如果子进程已经终止,则父进程会立即返回,并可以通过子进程的终止状态来了解子进程终止的 原因和状态。

下面来看例子:



waitpid()

waitpid()是Linux中的一个系统调用,用于等待指定子进程的终止并获取其终止状态。它可以用来在父进程中等待一个特定的子进程或者等待任何子进程的终止。

waitpid()函数的原型如下:

c 复制代码
#include <sys/types.h>
#include <sys/wait.h>

pid_t waitpid(pid_t pid, int *status, int options);

其中,参数pid 指定要等待的子进程的PID,可以有以下几种取值:

-1:等待任意子进程终止。

0:等待与调用进程在同一进程组的任意子进程终止。

大于0:等待指定PID的子进程终止。
参数status 是一个指向整型变量的指针,用于存储子进程的终止状态。
参数options用于指定附加的选项,如WNOHANG表示非阻塞方式等待,即如果没有子进程终止立即返回。

例子:





WIFEIERED


非阻塞等待





进程替换

进程替换是指在操作系统中将一个正在运行的进程替换为一个新的进程的过程。这个过程包括终止当前进程并加载新的程序代码、数据和资源,使新的进程开始执行。

在Linux中,常用exec()函数族来实现。

包括:

c 复制代码
#include <unistd.h>`
int execl(const char *path, const char *arg, ...);
int execlp(const char *file, const char *arg, ...);
int execle(const char *path, const char *arg, ...,char *const envp[]);
int execv(const char *path, char *const argv[]);
int execvp(const char *file, char *const argv[]);

命名理解:

l(list) : 表示参数采用列表

v(vector) : 参数用数组

p(path) : 有p自动搜索环境变量PATH

e(env) : 表示自己维护环境变量

接下来看它们的使用













多进程替换


相关推荐
liulilittle5 分钟前
[OPENPPP2] ssea 算法详解(中文)
算法·x86·x64·simd·openppp2·ssea·base94
不才不才不不才10 分钟前
Spring 源码系列(14): JDK 动态代理 vs CGLIB,以及拦截器责任链
java·开发语言·spring
碧海银沙音频科技研究院12 分钟前
蓝牙耳机使用WSDF5361锂保芯片进入船运模式实现方法
嵌入式硬件·算法
过期的秋刀鱼!22 分钟前
学习曲线-过拟合和欠拟合要做什么以及原因
人工智能·python·深度学习·算法·机器学习·模型评估
流云鹤23 分钟前
05Java学习day(5)
java·学习
aixingkong92131 分钟前
AI超节点Scale Up域总线各层优化设计
linux·服务器·网络
用户31268748772033 分钟前
Spring 事件机制到底怎么传播的?ApplicationEvent 源码拆解
java·spring
m沐沐42 分钟前
【自然语言处理】词向量转换与中文文本情感分类——从CountVectorizer到朴素贝叶斯
人工智能·算法·机器学习·自然语言处理·分类·中文分词·词向量转换
默辨44 分钟前
Spring AI Alibaba 核心知识点
java·ai·spring ai·spring alibaba
乐观的Terry1 小时前
10、发布系统-路由管理与灰度发布
java