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

linux C 语言开发 (八) 进程基础

   文章的目的为了记录使用C语言进行linux 开发学习的经历。开发流程和要点有些记忆模糊,赶紧记录,防止忘记。

  相关链接:

linux C 语言开发 (一) Window下用gcc编译和gdb调试

linux C 语言开发 (二) VsCode远程开发 linux

linux C 语言开发 (三) 建立云服务器

linux C 语言开发 (四) linux系统常用命令

linux C 语言开发 (五) linux系统目录结构

linux C 语言开发 (六) 程序的编辑和编译(vim、gcc)

linux C 语言开发 (七) 文件 IO 和标准 IO

linux C 语言开发 (八) 进程基础

Linux C到Android App开发推荐链接(入门十二章):

开源 java android app 开发(一)开发环境的搭建_csdn 开源 java android app-CSDN博客

开源 java android app 开发(一)开发环境的搭建-CSDN博客

开源 java android app 开发(二)工程文件结构-CSDN博客

开源 java android app 开发(三)GUI界面布局和常用组件-CSDN博客

开源 java android app 开发(四)GUI界面重要组件-CSDN博客

开源 java android app 开发(五)文件和数据库存储-CSDN博客

开源 java android app 开发(六)多媒体使用-CSDN博客

开源 java android app 开发(七)通讯之Tcp和Http-CSDN博客

开源 java android app 开发(八)通讯之Mqtt和Ble-CSDN博客

开源 java android app 开发(九)后台之线程和服务-CSDN博客

开源 java android app 开发(十)广播机制-CSDN博客

开源 java android app 开发(十一)调试、发布-CSDN博客

开源 java android app 开发(十二)封库.aar-CSDN博客

linux C到.net mvc开发推荐链接:

开源C# .net mvc 开发(一)WEB搭建_c#部署web程序-CSDN博客

开源 C# .net mvc 开发(二)网站快速搭建_c#网站开发-CSDN博客

开源 C# .net mvc 开发(三)WEB内外网访问(VS发布、IIS配置网站、花生壳外网穿刺访问)_c# mvc 域名下不可訪問內網,內網下可以訪問域名-CSDN博客

开源 C# .net mvc 开发(四)工程结构、页面提交以及显示_c#工程结构-CSDN博客

开源 C# .net mvc 开发(五)常用代码快速开发_c# mvc开发-CSDN博客、

内容:讲述进程的基础知识,进程就是正在运行的程序。讲述如何创建,运行种类等。

目录:

1.创建

2.执行

3.命令

4.种类

一、创建

        所有的进程都是由其他进程创建(除了 pid 为 0 号的 idle 进程) , pid 号为 1 的 init 进程是系统启动后运行的第一个进程, 是所有进程的父进程, init 进程会初始化一部分系统服务, 创建其他进程。

        创建新进程的那个进程称为父进程, 新进程称为子进程, 父进程和子进程拥有相同的代码段数据段,有各自独立的地址空间。 采用写时拷贝技术, 即创建的新进程不会立即把父进程的资源空间复制过来, 只有在修改时才会复制资源, 另外父进程挂起的信号和文件锁不会被子进程继承。

        子进程结束后, 它的父进程要回收它的资源, 否则就会成为僵尸进程 。

        如果父进程先结束, 子进程会被 init 进程收养, 称为孤儿进程

头文件#include <sys/types.h> #include <unistd.h>
函数pid_t getpid(void);
返回值PID 号
功能获取此进程 PID

头文件#include <sys/types.h> #include <unistd.h>
函数pid_t getppid(void);
返回值PID 号
功能获取父进程 PID

头文件#include <unistd.h>
函数pid_t fork(void);
返回值调用成功父进程返回子进程号, 子进程返回 0, 失败返回-1。
功能系统调用, 创建一个进程

#include <stdio.h>
#include <unistd.h>
int main(void)
{
pid_t pid;
pid = fork();
if (pid < 0)
{
printf("fork is error \n");
return -1;
} 
//父进程
if (pid > 0)
{
printf("This is parent,parent pid is %d\n", getpid());
} 
//子进程
if (pid == 0)
{
printf("This is child,child pid is %d,parent pid is %d\n", getpid(), get
ppid());
} 
return 0;
}

执行后的效果

二、执行

用 fork 函数创建子进程后, 子进程往往要调用一种 exec 函数以执行另一个程序, 该子进程被新的程序替换, 改变地址空间, 进程映像和一些属性, 但是 pid 号不变。

函数int execve(const char *filename, char *const argv[], char *const envp[]);
头文件#include <unistd.h>
参数 filename路径名, 表示载入进程空间的新程序路径。
参数 argv[]命令行参数, argv[0]为命令名
参数 envp[]新程序的环境变量
返回值成功时不会返回, 使用时不用检查返回值, 可通过 errno 检查。

以下函数都是根据 execve 实现:

int execl(const char *path, const char *arg, .../* (char *) NULL */);

int execlp(const char *file, const char *arg, .../* (char *) NULL */);

int execle(const char *path, const char *arg, .../*, (char *) NULL, char * const envp[] */);

int execv(const char *path, char *const argv[]);

int execvp(const char *file, char *const argv[]);

int execvpe(const char *file, char *const argv[],char *const envp[]);

演示代码

执行execl,创建execl_sub

execl代码

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int main(void)
{
int i=0;
pid_t pid;
pid = fork();
if (pid < 0)
{
printf("fork is error \n");
return -1;
} /
/父进程
if (pid > 0)
{
printf("This is parent,parent pid is %d\n", getpid());
} /
/子进程
if (pid == 0)
{
printf("This is child,child pid is %d\n", getpid(), getppid());
//改为自己的路径
execl("/home/samba/linux/15/hello","hello",NULL);
exit(1);
} i
++;
printf("i is %d\n",i);
return 0;
}

execl_sub代码

#include <stdio.h>
#include <unistd.h>
int main(void)
{
printf("hello world\n");
return 0;
}

演示效果

三、命令

进程常用命令为ps和kill

ps 命令: ps 命令可以列出系统中当前运行的那些进程。

命令格式: ps [参数]

命令功能: 用来显示当前进程的状态常用参数: aux

kill 命令: kill 命令用来杀死进程举例: kill -9(SIGKILL) PID

进程的状态

D: 无法中断的休眠状态 (通常 IO 的进程)
R: 正在执行中
S: 静止状态
T: 暂停执行
Z: 不存在但暂时无法消除
W: 没有足够的记忆体分页可分配
<: 高优先序的行程
N: 低优先序的行程
L: 有记忆体分页分配并锁在记忆体内 (实时系统或捱 A I/O)

显示所有进程

ps -aux

查找进程

ps aux | grep test

杀死进程

kill -9(SIGKILL) PID

四、种类

孤儿进程: 父进程结束以后, 子进程还未结束, 这个子进程就叫做孤儿进程。

僵尸进程: 子进程结束以后, 父进程还在运行, 但是父进程不去释放进程控制块, 这个子进程就叫做僵尸进程。

守护进程(daemon)是一类在后台运行的特殊进程, 用于执行特定的系统任务。 很多守护进程在系统引导的时候启动, 并且一直运行直到系统关闭。 另一些只在需要的时候才启动, 完成任务后就自动结束
 

要防止僵尸进程可以使用wait函数

wait()函数一般用在父进程中等待回收子进程的资源, 而防止僵尸进程的产生

函数pid_t wait(int *status)
头文件#include <sys/wait.h>
返回值成功返回回收的子进程的 pid, 失败返回-1


文章转载自:

http://IH3rjanM.rtsdz.cn
http://ETcqMQnp.rtsdz.cn
http://tUMnCSGr.rtsdz.cn
http://mlaCODf1.rtsdz.cn
http://3nZM9cZv.rtsdz.cn
http://W4MKR6Oq.rtsdz.cn
http://1b3wYFhJ.rtsdz.cn
http://8uiCmPp6.rtsdz.cn
http://CzDZ5cpQ.rtsdz.cn
http://Ud0tnq3l.rtsdz.cn
http://Xya2hktf.rtsdz.cn
http://uJUzujXV.rtsdz.cn
http://MXPSUFqu.rtsdz.cn
http://Is5ih91x.rtsdz.cn
http://tKX2xgUo.rtsdz.cn
http://F40WD97M.rtsdz.cn
http://5il05c5l.rtsdz.cn
http://uUAC4DBu.rtsdz.cn
http://xEeVaeqn.rtsdz.cn
http://ideykuF1.rtsdz.cn
http://uNI07h8Q.rtsdz.cn
http://2RyMkrSD.rtsdz.cn
http://SoCp2bGB.rtsdz.cn
http://Bb3yutsC.rtsdz.cn
http://zmWaLLUa.rtsdz.cn
http://0ehaCspj.rtsdz.cn
http://zdXEDVIz.rtsdz.cn
http://tReN19pG.rtsdz.cn
http://elhCrSfe.rtsdz.cn
http://d3DTQEN0.rtsdz.cn
http://www.dtcms.com/a/381133.html

相关文章:

  • Oracle SQL调优技巧实战指南
  • B1013 PAT乙级JAVA题解 数素数
  • oracle字符转time
  • 阿里巴巴开放开放平台商品详情接口技术实现:详情数据深度解析方案
  • python使用pip安装的包与卸载
  • 题目:快乐数
  • Leecode hot100 - 287. 寻找重复数
  • SQL优化分析学习
  • Thinking Machines的博客
  • Linux命令行的核心理念与实用指南
  • 单板挑战4路YOLOv8!米尔瑞芯微RK3576开发板性能实测
  • 硬件(九)寄存器、外设与中断机制
  • 《常见的设计模式——单例、代理与适配器》
  • 海龟交易策略
  • MySQL 事务
  • claude code使用小窍门
  • Recaptcha2 图像识别 API 对接说明
  • Spring中 @Value注解设置默认值
  • Linux / Windows 下连续发送多帧 8 字节指令,下位机只响应第一帧,第二帧“丢失”。
  • RStudio 教程:以抑郁量表测评数据分析为例
  • 驱动程序介绍及其安装说明
  • Day03 前缀和 | 1248. 统计「优美子数组」、53. 最大子数组和
  • 现代化心理中心场室建设与规划之道
  • 面向小白用户的多集群云原生应用管理平台设计
  • 怎么设计一个高效的任务调度器,避免任务饥饿
  • Linux运维核心知识体系总结:从安全加密到服务部署
  • 50期权日内交易技巧
  • 枚举算法和排序算法能力测试
  • 未来之窗昭和仙君 (四) 前端网页分页 — 东方仙盟筑基期
  • Class50 LSTM