文章的目的为了记录使用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 语言开发 (九) 进程间通讯--管道

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://www.pswp.cn/diannao/99173.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/99173.shtml
英文地址,请注明出处:http://en.pswp.cn/diannao/99173.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

从零学算法1094

1094.拼车 车上最初有 capacity 个空座位。车 只能 向一个方向行驶&#xff08;也就是说&#xff0c;不允许掉头或改变方向&#xff09; 给定整数 capacity 和一个数组 trips , trips[i] [numPassengersi, fromi, toi] 表示第 i 次旅行有 numPassengersi 乘客&#xff0c;接他…

B2B企业营销型AI Agent服务商推荐:谁更专业?如何选型?

一、引言&#xff1a;为什么B2B企业需要营销型AI Agent&#xff1f;在当前竞争激烈的B2B市场中&#xff0c;企业普遍面临几大挑战&#xff1a;线索获取难&#xff1a;获客成本持续上升&#xff0c;高质量线索难以筛选。销售周期长&#xff1a;从初步接触到签单&#xff0c;往往…

算法-双指针5.6

目录 &#x1f33f;力扣611-有效三角形得个数 &#x1f9ca;题目链接&#xff1a;https://leetcode.cn/problems/valid-triangle-number/description/ &#x1f9ca;题目描述&#xff1a;​编辑 &#x1f9ca;解题思路&#xff1a; &#x1f9ca;解题代码&#xff1a; &a…

超参数自动化调优指南:Optuna vs. Ray Tune 对比评测

点击 “AladdinEdu&#xff0c;同学们用得起的【H卡】算力平台”&#xff0c;注册即送-H卡级别算力&#xff0c;80G大显存&#xff0c;按量计费&#xff0c;灵活弹性&#xff0c;顶级配置&#xff0c;学生更享专属优惠。 引言&#xff1a;从"手动炼丹"到"自动化…

软考-局域网基础考点总结

这篇文章用于整理软考网络相关的知识点&#xff0c;囊括了详细的局域网基础的考点&#xff0c;能够让你认真备考&#xff0c;基础知识一网打尽&#xff0c;让后续的学习更加通畅~ 第一部分&#xff1a;OSI七层参考模型 OSI(Open System Interconnection)模型是一个理论框架&am…

Node.js核心模块介绍

1. fs 模块fs&#xff08;File System&#xff09;模块允许对文件系统进行操作&#xff0c;提供了文件读写、文件夹操作等功能。fs 支持同步和异步两种 API。1.1. 常用方法读取文件&#xff1a;异步: fs.readFile()同步: fs.readFileSync()写入文件&#xff1a;异步: fs.writeF…

缓存三大劫攻防战:穿透、击穿、雪崩的Java实战防御体系(二)

第二部分&#xff1a;缓存击穿——热点key过期引发的“DB瞬间高压” 缓存击穿的本质是“某个热点key&#xff08;高并发访问&#xff09;突然过期”&#xff0c;导致大量请求在同一时间穿透缓存&#xff0c;集中冲击DB&#xff0c;形成“瞬间高压”。 案例3&#xff1a;电商秒杀…

Linux相关概念和易错知识点(45)(网络层、网段划分)

目录1.网络层&#xff08;1&#xff09;IP协议头格式&#xff08;2&#xff09;工作流程2.网段划分&#xff08;1&#xff09;五类地址&#xff08;2&#xff09;回环地址&#xff08;3&#xff09;网段的特殊地址&#xff08;4&#xff09;网络建设我们前面暂时跳过了网络层&a…

transition(过渡)和animation(动画)——CSS

1.transition过渡可以为一个元素在不同状态之间进行切换时添加过渡效果&#xff0c;实现不同状态间的变化效果。通过触发事件(鼠标悬停、点击等)&#xff0c;在两个状态间切换。1.1 使用语法&#xff1a;transition: [property] [duration] [timing-function] [delay];property…

Spring Cloud项目国产化改造MySQL迁移达梦数据库,SQL变更

达梦数据库下载地址&#xff1a;https://eco.dameng.com/download 达梦数据库安装文档&#xff1a;https://eco.dameng.com/document/dm/zh-cn/start/dm-install-linux.html 数据迁移SQLark工具使用 首先&#xff0c;本次MySQL迁移使用了SQLark工具 1.下载安装SQLark https…

Cesium---1.133版本不修改源码支持arcgis MapServer 4490切片

参照了这篇博文&#xff1a;https://blog.csdn.net/qq_19689967/article/details/121449888https://blog.csdn.net/qq_19689967/article/details/121449888 利用新版本的源码进行了修改&#xff0c;可以实现服务加载&#xff1a; Event.js import { Check,defined} from &qu…

迭代器和生成器的区别与联系

目录 1.可迭代对象 (Iterable) 2.迭代器 (Iterator) 3.生成器 (Generator) 3.1生成器函数 vs 生成器表达式 4.三者之间的联系与区别 5.关系图&#xff08;帮助你一眼看懂&#xff09; 6.核心结论&#xff08;记住这三句话&#xff09; 1.可迭代对象 (Iterable) 定义&…

Dropout:深度学习中的随机丢弃正则化技术

本文由「大千AI助手」原创发布&#xff0c;专注用真话讲AI&#xff0c;回归技术本质。拒绝神话或妖魔化。搜索「大千AI助手」关注我&#xff0c;一起撕掉过度包装&#xff0c;学习真实的AI技术&#xff01; 1 什么是Dropout&#xff1f; Dropout是深度学习中最广泛使用的正则化…

vue2迁移到vite[保姆级教程]

vue2迁移到vite[保姆级教程]使用vue CLI创建项目进行vite迁移详细步骤1. 安装 Vite 和 Vue 2 支持插件2. 创建 vite.config.js3. 修改 package.json 脚本4. 创建 index.html5. 确保 main.js 正确引入6. 处理静态资源7. 构建优化&#xff08;可选&#xff09;8. 启动项目常见问题…

浏览器输入URL回车

一&#xff0c;URL解析浏览器会对输入的 URL&#xff08;统一资源定位符&#xff09; 进行拆解&#xff0c;搞清楚 “目标是谁、要获取什么资源https://www.baidu.com/s?wdCDN 拆解后&#xff1a;协议&#xff08;Scheme&#xff09;&#xff1a;https&#xff08;加密通信协议…

leedcode 算法刷题第三十四天

198. 打家劫舍 class Solution { public:int rob(vector<int>& nums) {if(nums.size()0){return 0;}else if(nums.size()1){return nums[0];}else if(nums.size()2){return max(nums[0],nums[1]);}vector<int> dp(nums.size()1,0);dp[0] nums[0];dp[1] nums…

计算机网络(二)物理层数据链路层

&#xff08;物理层、数据链路层... 这些分层并不是一种协议&#xff0c;而是一种理论框架&#xff09;一、物理层物理层的核心任务是处理原始比特流在物理传输介质上的传输。 主要任务物理层的主要任务可以概括为以下几点&#xff0c;它们是确保数据能在网络硬件间可靠传输的基…

android13修改WiFi扫描二维码识别识别成功率不高的问题

Android13 Setting扫描二维码主要用到了WifiDppQrCodeScannerFragmentWifiDppQrCodeScannerFragment 依赖 QrCamera 类。QrCamera 使用了 Camera1 的API。开发了新类 ModernQrScanner &#xff0c;采用了Camera2和更新了最新的Zxing包。添加一个新的二维码扫描的处理类&#…

AI赋能与敏捷融合:未来电源项目管理者的角色重塑与技能升级——从华为实战看高技术研发项目的管理变革

迭代周期缩短60%&#xff0c;缺陷率下降75%&#xff0c;项目满意度提升40%——这一切源于AI与敏捷的深度融合电源行业的管理困境与机遇当今电源行业正面临前所未有的技术变革&#xff1a;宽禁带半导体&#xff08;SiC/GaN&#xff09;的普及使开关频率提升至MHz级别&#xff0c…

Dify插件安装

Dify插件安装 官网&#xff1a;https://docs.dify.ai/zh-hans/plugins/quick-start/install-plugins1.4.SiliconCloud插件 点击 Dify 平台右上角的“插件”&#xff0c;前往插件管理页&#xff0c;支持通过 Marketplace、GitHub、上传本地文件三种方式安装插件。 Marketplace 你…