linux学习:进程(新建+运行某文件+退出处理函数+等待)

目录

api

创建新进程

注意

 运行某文件

例子

注意

例子,等待进程


进程是由进程控制块、程序段、数据段三部分组成

进程有都有一个父进程,除了init,父进程可以创建子进程

每个进程都有一个PID,可以用ps来查看,等于进程的身份证

pid是本身进程的pid,ppid是父进程的pid

api

创建新进程

当一个进程调用 fork( )成功后,fork( )将分别返回到两个进程之中,换句话说,fork( ) 在父子两个进程中都会返回,而他们所得到的返回值也不一样

注意

  • fork( )会使得进程本身被复制(想想细胞分裂),因此被创建出来的子进程和父进程几乎是一模一样的,说“几乎”意味着子进程并不是 100%为一份父进程的复印件,他们的具体关系如下,父子进程的以下属性在创建之初完全一样,子进程相当于搞了一份复制品
    • 实际 UID 和 GID,以及有效 UID 和 GID。
    • 所有环境变量。
    • 进程组 ID 和会话 ID。
    • 当前工作路径。除非用 chdir()加以修改
    • 打开的文件。
    • 信号响应函数。
    • 整个内存空间,包括栈、堆、数据段、代码段、标准 IO 的缓冲区等等
  • 父子进程是相互独立的:由于子进程完整地复制了父进程的内存空间,因此从内存 空间的角度看他们是相互独立、互不影响的
  • 父子进程是相互平等的:他们的执行次序是随机的

 运行某文件

  • 被加载的文件的参数列表必须以自身名字为开始,以 NULL 为结尾。比如要加载执 行当前目录下的一个叫做 a.out 的文件,需要一个参数”abcd”,那么正确的调用应该是: execl(“./a.out”, “a.out”, “abcd”, NULL); 或者:const char *argv[3] = {“a.out”, “abcd”, NULL};execv(“./a.out”, argv);
  • exec 函数簇成功执行后,原有的程序代码都将被指定的文件或脚本覆盖,因此这些函数一旦成功后面的代码是无法执行的,他们也是无法返回的

例子

1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <unistd.h>
4
5 int main(int argc, char **argv)
6 {
7     pid_t x;
8     x = fork();
9
10     if(x > 0) // 父进程
11     {
12         printf("[%d]: I am the parent\n", (int)getpid());
13         exit(0);
14     }
15
16     if(x == 0) // 子进程
17     {
18         printf("[%d]: I am the child\n", (int)getpid());
19         execl("./child_elf", "child_elf", NULL); // 执行 child_elf 程序
20
21         printf("NEVER be printed\n"); // 这是一条将被覆盖的代码
22     }
23
24     return 0;
25 }

运行结果是

[24585]: I am the parent
vincent@ubuntu:~/ch05/5.2$ [24586]: I am the child
[24586]: yep, I am the child

简单来说exit会执行退出程序之前运行退出处理函数,可以用atexit来注册退出处理函数,例如

void routine1(void) // 退出处理函数
{
    printf("routine1 is called.\n");
}
atexit(routine1);

注意

所谓的退出状态不是退出值,退出状态包括了退出值。如果使用以上两个函数成 功获取了子进程的退出状态,则可以使用以下宏来进一步解析

例子,等待进程

1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <stdbool.h>
4 #include <unistd.h>
5 #include <string.h>
6 #include <strings.h>
7 #include <errno.h>
8
9 #include <sys/stat.h>
10 #include <sys/types.h>
11 #include <fcntl.h>
12
13 int main(int argc, char **argv)
14 {
15     pid_t x = fork();
16
17     if(x == 0) // 子进程,执行指定程序 child_elf
18     {
19         execl("./child_elf", "child_elf", NULL);
20     }
21
22     if(x > 0) // 父进程,使用 wait( )阻塞等待子进程的退出
23     {
24         int status;
25         wait(&status);
26
27         if(WIFEXITED(status)) // 判断子进程是否正常退出
28         {
29             printf("child exit normally, " 
30                 "exit value: %hhu\n", WEXITSTATUS(status));
31         }
32
33         if(WIFSIGNALED(status)) // 判断子进程是否被信号杀死
34         {
35             printf("child killed by signal: %u\n", 
36                 WTERMSIG(status));
37         }
38     }
39
40     return 0;
41 }

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

目标检测应用场景—数据集【NO.30】织物缺陷图像目标检测数据集

写在前面&#xff1a;数据集对应应用场景&#xff0c;不同的应用场景有不同的检测难点以及对应改进方法&#xff0c;本系列整理汇总领域内的数据集&#xff0c;方便大家下载数据集&#xff0c;若无法下载可关注后私信领取。关注免费领取整理好的数据集资料&#xff01;今天分享…

2024第十五届蓝桥杯 JAVA B组

目录 前言&#xff1a;试题 A: 报数游戏试题 B: 类斐波那契循环数试题C:分布式队列 前言&#xff1a; 没参加这次蓝桥杯算法赛&#xff0c;十四届蓝桥杯被狂虐&#xff0c;对算法又爱又恨&#xff0c;爱我会做的题&#xff0c;痛恨我连题都读不懂的题&#x1f62d;,十四届填空只…

Linux基础(持续更新~)

常见的Linux目录 1、“/”&#xff1a;根目录 2、“/root”&#xff1a;root 用户的家目录 3、“/home/username ”&#xff1a;普通用户的家目录 4、“/etc”&#xff1a;配置文件目录&#xff08;类似于Windows的注册表&#xff09; 5、“/bin ”&#xff1a;命令目录 …

不再写满屏import导入

密密麻麻的import语句不仅仅是一种视觉上的冲击&#xff0c;更是对代码组织结构的一种考验。 我们是如何做到让import“占领满屏“的了&#xff0c;又该如何优雅地管理这些import语句呢&#xff1f; 本文将从产生大量import语句的原因、可能带来的问题以及如何优化和管理impo…

java版数字藏品深色UI仿鲸探数藏盲盒合成短视频卡牌模式支持高并发

Java版数字藏品深色UI仿鲸探数藏盲盒合成短视频卡牌模式支持高并发&#xff0c;是一种结合了Java技术、深色用户界面&#xff08;UI&#xff09;设计、数字藏品概念、盲盒合成玩法以及短视频卡牌模式的综合性应用。该模式旨在为用户提供一种新颖、有趣的数字藏品体验&#xff0…

深度学习pytorch实战第P3周--实现天气识别

>- **&#x1f368; 本文为[&#x1f517;365天深度学习训练营](https://mp.weixin.qq.com/s/0dvHCaOoFnW8SCp3JpzKxg) 中的学习记录博客** >- **&#x1f356; 原作者&#xff1a;[K同学啊](https://mtyjkh.blog.csdn.net/)** 引言 1.复习上周 深度学习pytorch实战-第…

算法-反转单向链表

需求 思路 链表必有节点&#xff0c;节点两要素&#xff1a;当前元素值&#xff0c;下一个节点地址 import java.util.Scanner;// 定义一个单向链表 public class MyLinkedList<E> {int size 0;// 顶一个私有的内部类&#xff0c;表示链表的节点public class Node {E da…

pyinstaller后打开qt的exe报错Available platform

具体弹窗&#xff1a; 处理&#xff1a; 添加临时的环境变量&#xff1a; cd dir && set QT_PLUGIN_PATH.\platforms && XXX.exe

【JAVA基础篇教学】第十三篇:Java中I/O和文件操作

博主打算从0-1讲解下java基础教学&#xff0c;今天教学第十三篇&#xff1a;Java中I/O和文件操作。 理解 Java 中的 I/O&#xff08;输入/输出&#xff09;和文件操作对于开发各种类型的应用程序都至关重要。I/O 操作涉及从文件、网络或其他数据源中读取数据&#xff0c;以及…

动态数据源实现分表走shardingsphere,不分表走其他

shardingsphere从4.1.1升级到5.2.1但是还没有完结&#xff0c;因为在执行存储过程的时候&#xff0c;系统提示错误如下。shardingsphere是不支持存储过程呢&#xff0c;但项目中不能避免使用存储过程&#xff0c;因为有大量的数据需要初始化&#xff0c;这种情况该如何应对&…

Java反序列化Commons-Collections-CC1链

环境搭建 JDK8u71以下&#xff0c;这个漏洞已经被修复了&#xff0c;这个JDK的以上版本都修复了漏洞 JDK8u65 下载地址 https://www.oracle.com/cn/java/technologies/javase/javase8-archive-downloads.html这个时候来到 pom.xml 配置Maven依赖下载CommonsCollections3.2.…

UE5 GAS开发P31 将hud绑定在自己的角色上

在WidgetController内新建一个OverlayAuraWidgetController,然后修改HUD的初始状态 AuraHUD // Fill out your copyright notice in the Description page of Project Settings. #pragma once #include "CoreMinimal.h" #include "GameFramework/HUD.h" #…

“Python+”集成技术高光谱遥感数据处理与机器学习深度应用

涵盖高光谱遥感数据处理的基础、python开发基础、机器学习和应用实践。重点解释高光谱数据处理所涉及的基本概念和理论&#xff0c;旨在帮助学员深入理解科学原理。结合Python编程工具&#xff0c;专注于解决高光谱数据读取、数据预处理、高光谱数据机器学习等技术难题&#xf…

亚马逊测评必看:全面剖析亚马逊测评,你不知道的那些事!

随着电商市场的拓展&#xff0c;曹哥今天针对测评小白们写一些入门知识&#xff0c;今天就带大家从内到外的亚马逊这个平台讲一讲 首先这个行业里分别有几个角色&#xff1a; 1.卖家&#xff1a;所有的服务基本上都是围绕着卖家来转 2.买家&#xff1a;也就是购买下单上评论…

GpuMall镜像社区上线啦!超值福利抢鲜体验!

想快速体验最新最优镜像&#xff1f;想随手分享你的原创镜像&#xff1f;想寻找一个交流镜像的优质平台&#xff1f;我们听到了广大友友们迫切的心声&#xff01; GpuMall智算云 | 省钱、好用、弹性。租GPU就上GpuMall,面向AI开发者的GPU云平台 现在&#xff01;我们的镜像社…

Rust腐蚀服务器插件安装教程

Rust腐蚀服务器插件安装教程 大家好我是艾西&#xff0c;一个做服务器租用的网络架构师。之前教大家怎么搭建Rust腐蚀服务器&#xff0c;那么很多小伙伴在搭建完成后发现自己的游戏跟平台玩的还是有差别&#xff0c;其实这里主要缺少mod插件了。那么本期我们教一下大家mod插件…

跑腿平台隐藏服务用法,搭建平台这些跑腿服务也能做!

跑腿场景竞争愈发激烈激烈 事实上&#xff0c;跑腿行业早已群狼环伺&#xff0c;尽管跑腿领域仍有很大的发展空间&#xff0c;但新晋玩家都普遍把目光投向了外卖配送这个细分领域&#xff0c;难免会增加后来者的市场拓展和发展难度。那么&#xff0c;在跑腿服务行业中还有哪些…

Linux服务器磁盘扩容后,但是宝塔面板没有即使生效,以解决~!

前景描述&#xff1a;我是100G的磁盘&#xff0c;扩容到200G. 第一步查看服务器的当前磁盘 df -h 显示 99G&#xff0c;已经扩容了&#xff0c;但是服务器还没有更新信息。 第二步安装插件&#xff1a; yum install -y cloud-utils-growpart 第三步扩展分区&#xff1a; …

Java基础(变量)

什么是变量&#xff1f; 变量&#xff1a;在程序的执行过程中&#xff0c;其值有可能发生改变的量&#xff08;数据&#xff09; 变量的使用场景 当某个数据经常发生改变时&#xff0c;我们也可以用变量储存。当数据变化时&#xff0c;只要修改变量里面记录的值即可。 变量…

C++生成动态库,C++和C#以及Java在windows和linux调用

Windows生成dllC库 1、创建动态链接库项目 源文件编写函数 // dllmain.cpp : 定义 DLL 应用程序的入口点。 #include "pch.h"int sum(int a, int b) {return a b; }BOOL APIENTRY DllMain( HMODULE hModule,DWORD ul_reason_for_call,LPVOID lpReserved) {switch…