Linux系统编程——进程(函数)

回调函数:

atexit()

原型:        int atexit(void (*function)(void));

功能:        注册进程退出前执行的函数

参数:        @function        函数指针,指向void返回值void参数的函数指针

返回值        成功 返回0

                   失败 返回非0

当注册调用exit或者由main函数执行return时,所有用atexit注册的退出函数,将会由注册时顺序被调用

代码示例:

#include <dirent.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <unistd.h>FILE* fp;
char* p;
void clean()
{printf("clean fun ,p is %s\n", p);fclose(fp);free(p);
}int main(int argc, char** argv){atexit(clean);fp = fopen("1.txt", "r");p = malloc(50);strcpy(p, "hello");printf("process will end..\n");return 0;
}

进程空间的回收

wait() / waitpid()

原型:        pit_t wait(int *status);        //阻塞回收(等待子进程结束再回收)

功能:        该函数可以阻塞等待任意子进程退出并回收该进程的状态(一次回收一个子进程)

                        //一般用于父进程回收子进程的状态

参数:        @status        进程退出时候的状态

                        //如果不关心其退出状态一般用NULL表示

                        //如果要回收进程退出状态(正常退出 / 异常退出),则用WEXITSTATUS回收

返回值        成功 返回回收的子进程的pid

                   失败 返回-1

1)如果所有的子进程都在运行,在阻塞
2)如果一个子进程终止,正在等待的父进程则获得终止状态,获得子进程的状态后,立刻返回。
3)如果没有子进程,则立即出错退出。

4)由父进程调用,回收子进程的pcb,会阻塞,父进程回收资源的时候,子进程没有退出。父进程就会等待子进程结束再回收。


waitpid(-1, status, 0) = wait(status)

原型:        pid_t waitpid(pid_t pid, int status);        //非阻塞回收

功能:        用于等待特定子进程的状态变化

参数:        @pid

                   @status

int status;
waitpid(pid, &status, 0);

// 检查宏:        //三组宏两两一组配合使用
WIFEXITED(status)    // 子进程正常退出
WEXITSTATUS(status)  // 获取退出状态码


WIFSIGNALED(status)  // 子进程被信号终止
WTERMSIG(status)     // 获取终止信号编号


WIFSTOPPED(status)   // 子进程是否被暂停
WSTOPSIG(status)     // 获取暂停信号编号

返回值

        


代码示例:

//<1>完整使用示例

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>int main(int argc, char **argv)
{pid_t pid = fork();if (pid > 0){printf("father pid:%d, child pid:%d\n", getpid(), pid);int status;while (1){//非阻塞回收pid_t recycle_pid = waitpid(pid, &status, WNOHANG);  if (pid == recycle_pid)                              {printf("recycle_pid:%d\n", recycle_pid);//子进程正常结束if (WIFEXITED(status)){printf("child ret value is %d\n", WEXITSTATUS(status));}else if (WIFSIGNALED(status)){printf("child unnormal,signal is %d\n", WTERMSIG(status));}break;}else if (0 == recycle_pid)  //子进程未结束{printf("子进程未结束...\n");usleep(1000*500);//0.5s}else{printf("waitpid error...\n");break;}}}else if (0 == pid){int i = 10;while (i--){printf("I'm processing....\n");sleep(1);}exit(20);}else{perror("fork error\n");return 1;}return 0;
}

//<2>非阻塞回收制定进程

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>int main(void)
{int id = 2;int n = 0;printf("n = :");scanf("%d", &n);pid_t pid[5] = {0};//创建5个子进程while (n--){pid[n] = fork();if (pid[n] > 0){continue;}else if (0 == pid[n]){printf("%d pid:%d\n",n, getpid());sleep(rand() % 5+1);exit(20);}else{perror("fork err...\n");return 1;}}//回收id = 2的进程while (1){pid_t recycle_pid = waitpid(pid[id-1], NULL, WNOHANG);if(pid[id-1] == recycle_pid)    //回收成功,相当于recycle_pid > 0{printf("recycle_pid: %d success\n",recycle_pid);break;}else if(0 == recycle_pid)   {}else    //recycle_pid<0,回收失败{printf("recycle_pid failure....\n");}}return 0;
}

exec族

        功能:用fork创建子进程后执行的是和父进程相同的程序 (但有可能执行不同的代码分支)
子进程往往要调用一种exec函数以执行另一个程序。当进程调用一种exec函数时,该进程的
用户空间代码和数据完全被新程序替换,从新程序的启动例程开始执行。调用exec并不创建
新进程,所以调用exec前后该进程的id并未改变。
其实有六种以exec开头的函数,统称exec函数:

头文件:#include <unistd.h>

!!!调用非系统可执行程序,第一个参数都传路径+文件名


原型:        int execl(const char *path, const char *arg, ...,/* (char  *) NULL */);  // l :list

参数:        @path        可执行程序的路径

                   @arg        参数 [字符串的形式] 列表,可以有多个 

                   @NULL        参数结束标志(不能省)

示例:execl("/bin/ls", "ls","-a","-l","--color == auto",NULL);


原型:        int execlp(const char *file, const char *arg, ...,/* (char  *) NULL */);  //p: PATH

参数:        @file        文件名(在系统路径$PATH 下可以找到)        //命令:echo $PATH

                   @arg        参数 [字符串的形式] 列表,可以有多个 

                   @NULL        参数结束标志(不能省)

示例:

 PATH 系统环境变量 查看命令:echo $PATH
execlp("ls", "ls", "-a", "-l", "--color=auto", NULL);


原型:        int execv(const char *path, char *const argv[],NULL);        // v:vector(数组)

参数:        @path        可执行程序的路径

                   @arg        参数 [字符串的形式] 列表,可以有多个 

                   @NULL        参数结束标志(不能省)

示例:

char *const args[] = {"cp", "11exec.c", "cp.txt",NULL};
execv("/bin/cp", args);


原型:         int execvp(const char *file, char *const argv[],NULL);  // vp: vector path        

参数:        @file        文件名(在系统路径$PATH 下可以找到)         //命令:echo $PATH

                   @arg        参数 [字符串的形式] 列表,可以有多个 

                   @NULL        参数结束标志(不能省)

示例:

char *const args[] = {"cat","11exec.c",NULL};
execvp(args[0], args);


  

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

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

相关文章

均胜电子上半年毛利率持续提升,汽车智能化与机器人业务多点突破

8月25日&#xff0c;全球领先的智能汽车科技解决方案提供商均胜电子&#xff08;600699.SH&#xff09;发布2025上半年业绩&#xff0c;报告期内公司实现营业收入约303.47亿元&#xff0c;同比增长12.07%&#xff1b;营业利润总额约12.47亿元&#xff0c;归母净利润同比增长11.…

【QT入门到晋级】进程间通信(IPC)-共享内存

前言 前面分享了几种IPC通信技术&#xff0c;都有成熟的交互机制&#xff08;阻塞和非阻塞方式交互&#xff09;&#xff0c;而本文分享的共享内存&#xff0c;更像是系统提供了一张“白纸”&#xff0c;让多个进程自己构建管理及安全机制&#xff0c;而有些场景只需要简单的机…

自动化测试概念与 Web 自动化实战(基于 Selenium)

在软件测试领域&#xff0c;自动化测试是提升测试效率、保障回归测试质量的核心手段。尤其对于 C 开发的项目&#xff0c;自动化测试能有效减少重复手工操作&#xff0c;避免新增功能对历史功能的影响。本文从自动化基础概念入手&#xff0c;详解自动化分类、Web 自动化测试核心…

NeRAF、ImVid论文解读

目录 一、NeRAF 1、概述 2、方法 3、训练过程 4、实验 二、ImVid 1、概述 2、Imvid数据集 3、STG方法 一、NeRAF 1、概述 NeRF类方法仅支持视觉合成功能&#xff0c;缺乏声学建模能力。对于以往的声学建模&#xff08;如NAR/INRAS&#xff09;会忽略三维场景几何对声…

重复文件删除查找工具 Duplicate Files Search Link v10.7.0

软件介绍 Duplicate Same Files Searcher 是一款面向 Windows 平台的专业重复文件检索与清理工具&#xff0c;兼具符号链接替换与 NTFS 高级特性支持&#xff0c;可在无损数据的前提下大幅缩减磁盘冗余。 软件使用 软件打开后是英文版&#xff0c;手动切换中文&#xff08;按…

简易shell

目录 一、整体功能概述 函数准备 1.env命令 2.getenv()函数 3.snprintf 4.strtok()函数 三、全局变量 四、核心功能函数解析 1. 信息获取函数 2. 命令行交互 3. 命令解析 4. 普通命令执行 5. 内置命令处理&#xff08;核心功能&#xff09; 五、主函数流程 六、总…

网关资源权限预加载:从冷启动阻塞到优雅上线的完整闭环

网关资源权限预加载:从冷启动阻塞到优雅上线的完整闭环 基于 Spring Cloud Gateway + Spring Cloud Alibaba Nacos ——一篇可落地的技术方案与源码级实现 1. 场景与痛点 在微服务网关层做 统一资源权限校验 时,必须满足: 启动阻塞:所有权限规则加载完成前,不监听端口,拒…

open webui源码分析8—管道

我们可以把Open WebUI想象成一个管道系统&#xff0c;数据通过管道和阀门流动。管道作为open webui的插件&#xff0c;可以为数据构建新的通路&#xff0c;可以自定义逻辑和处理数据&#xff1b;阀门是管道的可配置部件&#xff0c;控制数据流过管道时的行为。管道可以理解成用…

深入理解 C 语言 hsearch 哈希表:限制、技巧与替代方案

概述 C 语言标准库中的 hsearch 系列函数提供了一套简单易用的哈希表实现,包含在 <search.h> 头文件中。这组函数虽然接口简洁,但在实际使用中存在一些重要的限制和注意事项。本文将深入探讨 hsearch 的功能特点、设计局限,并提供实用的解决方案和替代建议。 hsearc…

Web网络开发 -- HTML和CSS基础

HTML 超文本编辑语言 HTML 介绍 HTML的英文全称是 Hyper Text Markup Language&#xff0c;即超文本标记语言。HTML是由WEB的发明者 Tim Berners-Lee &#xff08;蒂姆伯纳斯李&#xff09;和同事 Daniel W. Connolly于1990年创立的一种标记语言&#xff0c; 它是标准通用化标…

Python爬虫实战:研究开源的高性能代理池,构建电商数据采集和分析系统

1. 绪论 1.1 研究背景与意义 随着互联网技术的飞速发展,网络数据已成为信息时代的核心资源之一。从商业角度看,企业通过分析竞争对手的产品信息、用户评价等数据,可制定更精准的市场营销策略;从学术研究角度,研究者通过爬取社交媒体数据、学术文献等,可开展社会网络分析…

项目设计文档——爬虫项目(爬取天气预报)

一、项目背景以及项目意义 项目背景&#xff1a; 爬虫技术的核心目的是自动化地从互联网上采集&#xff0c;提取和存储数据。网络爬虫是一种自动化程序&#xff0c;用于从互联网上抓取数据并进行处理。C语言因其高效性和接近硬件的特性&#xff0c;常被用于开发高性能的网络爬…

Python 操作 PPT 文件:从新手到高手的实战指南

在日常工作和学习中&#xff0c;PPT 是我们展示信息和进行演示的重要工具。无论是制作报告、演讲还是教学课件&#xff0c;PPT 都扮演着不可或缺的角色。然而&#xff0c;当面对大量重复性的 PPT 编辑任务时&#xff0c;手动操作不仅耗时耗力&#xff0c;还容易出错。幸运的是&…

系统设计中的幂等性

1. 基本概念 幂等性&#xff08;Idempotence&#xff09;是系统设计中经常提到的概念。如果某个操作执行一次或多次都能产生相同的结果&#xff0c;那么它就是幂等的。2. 代码示例 下面这段代码是幂等的。无论你调用多少次&#xff0c;show_my_button 的最终状态都是False。 de…

Pandas vs Polars Excel 数据加载对比报告

📊 Pandas vs Polars Excel 数据加载对比报告 1. 数据基本情况 数据文件:data.xlsx 数据规模:23,670 行 3 列 字段: case_time:日期/时间 case_name:公司名称(字符串) board:所属板块(字符串) 2. 加载方式与代码 Pandas import pandas as pdfrom tools import…

Kafka 为什么具有高吞吐量的特性?

Kafka 高吞吐量原因&#xff1a;面试题总结 在面试中&#xff0c;Kafka 的高吞吐量设计是高频考点&#xff0c;核心需围绕“架构设计”“存储优化”“网络效率”“资源利用”四个维度展开&#xff0c;以下是结构化总结&#xff1a; 一、核心架构&#xff1a;并行化与分层设计分…

MCP 协议原理与系统架构详解—从 Server 配置到 Client 应用

1. MCP MCP&#xff08;Model Context Protocol&#xff0c;模型上下文协议&#xff09;是开发 Claude 模型的(Anthropic)公司推出的一个开放标准协议&#xff0c;就像是一个 “通用插头” 或者 “USB 接口”&#xff0c;制定了统一的规范&#xff0c;不管是连接数据库、第三方…

uniapp安卓真机调试问题解决总结

uniapp安卓真机调试遇到各种连接不上问题&#xff1a; 手机上打开调试数据线不行&#xff0c;换数据线电脑重启手机重启拔出数据线&#xff0c;换个USB插口。

Linux Qt创建和调用so库的详细教程

一、创建so库1.文件-->新建文件或项目-->Library->C Library&#xff0c;如下图2.工程命名为Example3.一直下一步就可以4、工程创建完成&#xff0c;如下图5、删除Example_global.h6、配置.pro文件# 设置输出目录 DESTDIR $$PWD/output #只生成.so文件 CONFIG plugi…

【深度学习】蒙特卡罗方法:原理、应用与未来趋势

作者选择了由 Ian Goodfellow、Yoshua Bengio 和 Aaron Courville 三位大佬撰写的《Deep Learning》(人工智能领域的经典教程&#xff0c;深度学习领域研究生必读教材),开始深度学习领域学习&#xff0c;深入全面的理解深度学习的理论知识。 之前的文章参考下面的链接&#xf…