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

linux进程和进程通信编程(1)

What makes the desert beautiful is that somewhere it hides a well.

沙漠之所以美丽,是因为在它的某个角落隐藏着一口井.

linux进程和进程通信编程(1)

    • 1.什么是进程
    • 2.进程id(pid)
    • 3.进程间通信的方法
      • 管道
      • 信号
      • IPC
      • Socket
    • 4.创建进程
      • fork
        • fork有三个返回值
        • 父进程pid为1的原因
    • 5.exec函数族
      • execl
      • 15.c代码
    • 6.ps
    • 7.kill
      • 16.c代码
    • 8.孤儿进程
      • 17.c代码
    • 9.僵尸进程
      • 172.c代码
    • 10.wait
      • 18.c代码
    • 11.守护进程
      • 如何创建守护进程
      • 19.c代码

1.什么是进程

正在运行的程序

进程 : 相当于一个同学

进程组 : 相当于一个班

会话 : 相当于一个年级

进程直接要通过linux内核进行通信
在这里插入图片描述
就绪态: 就差cpu

执行态到阻塞态: 因为某件事给卡住了

2.进程id(pid)

每个进程唯一的标识符

3.进程间通信的方法

管道

有名管道, 无名管道

信号

发送, 结束, 处理

IPC

共享内存, 消息队列, 信号灯

Socket

4.创建进程

用一个进程(父进程)去创建另一个进程(子进程)

子进程相当于父进程的拷贝

fork

参考程序14.c

//头文件
#include <sys/types.h>
#include <unistd.h> 

fork有三个返回值

在父进程里面,返回子进程pid; 在子 进程里返回0, 出错返回负数

原本这整个程序是父进程, 最开始用了fork, 就生成了一个子进程(看不见的), 父子进程都去完整的执行了这个程序(因为可以看见分别执行了两次i++), 只是父进程只能去输出第一个if, 子进程只能去输出第二个if
在这里插入图片描述

父进程pid为1的原因

因为由于父进程先退出了,造成子进程被init(ID=1)接管,所以用getppid出来的是1. 最后在跑父进程的时候加了sleep就能保证父进程后退出。
在这里插入图片描述

5.exec函数族

execl

相关程序15.c

用于让父子进程去执行不同的程序(x.sh)或命令(ls)

execl执行之后, 子进程就不会再往后执行了

execl("要执行的文件的绝对路径", "./要执行的文件", 要执行的文件的参数);

1 . 用法

查找要执行的文件的绝对路径, 记得给需要执行的文件加权限
在这里插入图片描述

execl("/root/amiao/15.1.sh", "./15.1.sh", NULL);

如果执行成功, j就不返回, 不成功 , j就返回-1
在这里插入图片描述
2 . execl执行之后, 子进程就不会再往后执行了

比如这个, 父进程把整个程序执行完了(因为输出了i), 子进程执行了execl之后就没有执行i++了
在这里插入图片描述
这个也可以看出来, 把execl移到前面去, a++也不执行了
在这里插入图片描述
3 . 放父进程也一样, 不执行a++了
在这里插入图片描述
4 . 执行pwd命令

一般系统命令路径就是/bin/xx
在这里插入图片描述

15.c代码

// execl#include <stdio.h> //用于main函数
#include <stdlib.h>
#include <sys/types.h> //用于pid_t#include <unistd.h> //用于close,read,write,forkint main() //不含参数
{int j;int a = 0;int b = 0;pid_t pid; //定义一个pid来接收fork的返回值pid = fork();int i = 0;if (pid < 0){printf("创建失败");}//父进程if (pid > 0){printf("这是父进程,其pid为%d\n", getpid()); // getpid是获得当前进程id}//子进程if (pid == 0){printf("a:%d\n", a);printf("这是子进程,其pid为%d,", getpid()); // getpid是获得当前进程pidprintf("其父进程pid为%d\n", getppid());    // getppid是获得当前进程父进程的pid// j = execl("/root/amiao/15.1.sh", "./15.1.sh", NULL);  //运行15.1.sh,要用绝对路径// printf("j:%d\n", j);execl("/bin/pwd", "pwd", NULL);printf("b:%d\n", b);}i++;printf("i:%d\n", i);
}

6.ps

用于列出系统中正在运行的进程的各种信息, 比如pid
在这里插入图片描述
查看某一个命令的进程
在这里插入图片描述

7.kill

用于杀死进程

相关程序16.c

要一边运行16.c(编译成hell), 一边查pid才行, 不然pid查的是错的
在这里插入图片描述
如果是按f9运行的(这里我用的VScode远程连接的kali), 就直接查16(VS把16.c编译成16)
在这里插入图片描述

16.c代码

// kill的用法#include <stdio.h> //用于main函数
#include <stdlib.h>
#include <sys/types.h> //用于pid_t#include <unistd.h> //用于close,read,write,forkint main() //不含参数
{pid_t pid; //定义一个pid来接收fork的返回值pid = fork();if (pid < 0){printf("创建失败");}//子进程if (pid == 0){while (1){printf("这是子进程,其pid为%d,", getpid()); // getpid是获得当前进程pid}              }}

8.孤儿进程

参考进程17.c

就是一个没结束的子进程, 但它的父进程已经结束了

这个子进程的ppid为1(有些特殊的系统可能不是1)

比如这个,先运行完父进程,再运行子进程,就得到父进程为1
在这里插入图片描述

17.c代码

// 孤儿进程#include <stdio.h> //用于main函数
#include <stdlib.h>
#include <sys/types.h> //用于pid_t#include <unistd.h> //用于close,read,write,forkint main() //不含参数
{pid_t pid; //定义一个pid来接收fork的返回值pid = fork();if (pid < 0){printf("创建失败");}//父进程if (pid > 0){while (1);printf("这是父进程,其pid为%d\n", getpid()); // getpid是获得当前进程id}//子进程if (pid == 0){// sleep(2);             //停2s,让父进程先结束,再运行子进程printf("这是子进程,其pid为%d,", getpid()); // getpid是获得当前进程pidprintf("其父进程pid为%d\n", getppid());    // getppid是获得当前进程父进程的pid}}

9.僵尸进程

参考进程172.c

是一个没有被释放进程块的子进程

父进程没结束, 子进程结束了, 但是父进程不去释放这个进程控制块
在这里插入图片描述
kill父进程
在这里插入图片描述

172.c代码

// 僵尸进程#include <stdio.h> //用于main函数
#include <stdlib.h>
#include <sys/types.h> //用于pid_t#include <unistd.h> //用于close,read,write,forkint main() //不含参数
{pid_t pid; //定义一个pid来接收fork的返回值pid = fork();if (pid < 0){printf("创建失败");}//父进程if (pid > 0){while (1);}//子进程if (pid == 0){// sleep(2);             //停2s,让父进程先结束,再运行子进程printf("这是子进程,其pid为%d,", getpid()); // getpid是获得当前进程pidprintf("其父进程pid为%d\n", getppid());    // getppid是获得当前进程父进程的pid}}

10.wait

用于减少僵尸进程产生

当父进程调用了wait, 就会直接阻塞父进程, 然后去把父进程的子进程结束之后的空间给释放了

参考程序18.c

//头文件
#include <wait.h>

在这里插入图片描述

18.c代码

//wait,用于减少僵尸进程产生,当父进程调用了wait, 就会直接阻塞父进程, 然后去把父进程的子进程结束之后的空间给释放了#include <stdio.h> //用于main函数
#include <stdlib.h>
#include <sys/types.h> //用于pid_t#include <unistd.h> //用于close,read,write,fork
#include <wait.h> //用于waitintmain() //不含参数
{pid_t pid; //定义一个pid来接收fork的返回值pid = fork();if (pid < 0){printf("创建失败");}//父进程if (pid > 0){sleep(2); //停2s,让子进程先结束,再运行父进程int status;wait(&status);if (WIFEXITED(status) == 1)          // WIFEXITED(status)==1表示子进程是正常运行完退出的,不是被kill的{ printf("子进程结束的返回:%d\n" ,WEXITSTATUS(status));//返回子进程中的exit里面的数}}//子进程if (pid == 0){printf("这是子进程,其pid为%d,", getpid()); // getpid是获得当前进程pidprintf("其父进程pid为%d\n", getppid());    // getppid是获得当前进程父进程的pidexit(6);}
}

11.守护进程

就是后台进程, 与所有终端没有关联, 不能和用户交互, 不能ctrl+c退出

参考程序19.c

如何创建守护进程

其中1 ,2 ,6 是必须的

1 . 必须是init(pid=1的那个) 的子进程

用fork创建一个子进程, 然后让父进程用exit退出, 然后这个子进程就是init的子进程了

2 . 不跟终端交互

用setsid函数创建一个新会话, 会话里面的首进程不和终端交互

3 . 用chdir , 将当前目录改成根目录

因为有时候会把程序写在U盘里, U盘拔了 , 就不能在系统里面运行了, chdir用于避免这种情况

4 . 重设umask文件掩码

父进程和子进程掩码是一样的, 如果不想要一样的, 就用umask改了

5 . 关闭文件描述符

用于节约资源

6 . 执行代码

该输出的还是会输出,只是重启时会开机自启
在这里插入图片描述

19.c代码

// 守护进程#include <stdio.h> //用于main函数
#include <stdlib.h>
#include <sys/types.h> //用于pid_t
#include <sys/stat.h>#include <unistd.h> //用于close,read,write,fork
int main()          //不含参数
{pid_t pid; //定义一个pid来接收fork的返回值pid = fork();if (pid < 0){printf("创建失败");}//父进程if (pid > 0){exit(0); //让父进程直接退了}//子进程if (pid == 0){setsid();             //用setsid函数创建一个新会话,不跟终端交互chdir("/");          //将当前目录改成根目录umask(0);             //重设umask文件掩码close(0);            //关闭文件描述符while (1)             //用while循环写出一直要执行的代码{printf("hh");printf("其父进程pid为%d\n", getppid());}}
}

相关文章:

linux进程和进程通信编程(1)

What makes the desert beautiful is that somewhere it hides a well. 沙漠之所以美丽,是因为在它的某个角落隐藏着一口井. linux进程和进程通信编程&#xff08;1&#xff09;1.什么是进程2.进程id(pid)3.进程间通信的方法管道信号IPCSocket4.创建进程forkfork有三个返回值父…...

操作系统(1.3)--习题

一、课堂习题 1、一个作业第一 次执行时用了5min ,而第二次执行时用了6min,这说明了操作系统的( )特点。 A、并发性 B、共享性 C、虚拟性 D、不确定性 D 2、在计算机系统中,操作系统是( )。 A、处于裸机之上的第一层软件 B、处于硬件之下的低层软件 C、处于应用软件之上的系统软…...

刷题笔记之十三(有假币、最难的问题、因子个数)

目录 1. 求正数数组的最小不可组成和 2. 有假币 3. 继承时先调用父类的构造方法;类中的成员变量的初始化操作都在构造方法时进行 4. 学会并理解装箱拆箱,注意new出来的也可以拆!! 5. getDeclaredMethods()是标识类或接口的声明成员(这个表示public private 包访问权限 pro…...

5个代码技巧,加速你的Python

5个代码技巧&#xff0c;加速你的Python 人生苦短&#xff0c;快学Python&#xff01; Python作为一种功能强大的编程语言&#xff0c;因其简单易学而受到很多初学者的青睐。它的应用领域又非常广泛&#xff1a;科学计算、游戏开发、爬虫、人工智能、自动化办公、Web应用开发…...

字节跳动软件测试岗,前两面过了,第三面HR天坑!竟然跟我说……

阎王易见&#xff0c;小鬼难缠。我一直相信这个世界上好人居多&#xff0c;但是也没想到自己也会在阴沟里翻船。我感觉自己被字节跳动的HR坑了。在这里&#xff0c;我只想告诫大家&#xff0c;offer一定要拿到自己的手里才是真的&#xff0c;口头offer都是不牢靠的&#xff0c;…...

[数据分析与可视化] Python绘制数据地图1-GeoPandas入门指北

本文主要介绍GeoPandas的基本使用方法&#xff0c;以绘制简单的地图。GeoPandas是一个Python开源项目&#xff0c;旨在提供丰富而简单的地理空间数据处理接口。GeoPandas扩展了Pandas的数据类型&#xff0c;并使用matplotlib进行绘图。GeoPandas官方仓库地址为&#xff1a;GeoP…...

ChatGPT加强版GPT-4面世,打工人的方式将被颠覆

&#x1f517; 运行环境&#xff1a;chatGPT&#xff0c;GPT-4 &#x1f6a9; 撰写作者&#xff1a;左手の明天 &#x1f947; 精选专栏&#xff1a;《python》 &#x1f525; 推荐专栏&#xff1a;《算法研究》 #### 防伪水印——左手の明天 #### &#x1f497; 大家好&#…...

Python逆向及相关知识

今天第二次看见python字节码的逆向题&#xff0c;然后发现了一个介绍Python逆向的文章&#xff0c;所以把文章里的内容简单整理记录一下。 文章参考&#xff1a;https://www.cnblogs.com/blili/p/11799398.html Python运行原理&#xff1a; 一.什么是Python Python 是一种解…...

Python基础语法、注意点加实例全解

本篇文章我们讲解Python最基础语法&#xff0c;包含&#xff1a;数据类型、注释、变量、类型转换、命名规范、运算符、字符串拼接、字符串格式化、if条件判断、while循环、for循环、函数、读取文件、写入文件、异常捕获、包导入等。通过讲解语法注意事项实例代码详解&#xff0…...

ETH RPC搭建

配置选择先是看了aws、谷歌云、阿里云这个配置都要1-2wrmb一个月&#xff0c;太贵了问了很多朋友&#xff0c;打算用hetzner&#xff0c;50欧一个月足以我选的配置&#xff1a;64gb&#xff0c;2tb ssd开好后在邮箱收到信息链接后按以下步骤安装系统&#xff1a;https://0o0.me…...

南京邮电大学数据库第一次课后作业

1.单选题 (5分) (B)是存储在计算机内有结构的数据的集合。 &#xff08;A&#xff09;数据库系统 &#xff08;B&#xff09;数据库 &#xff08;C&#xff09;数据库管理系统 &#xff08;D&#xff09;数据结构 2.单选题 (5分) 数据库的特点之一是数据的共享,严格的讲,这里的…...

近期投简历、找日常实习的一些碎碎念(大二---测试岗)

嘿嘿嘿&#xff0c;我又回来了&#xff0c;相信不少兄弟已经发现我似乎已经断更了好久&#xff0c;哈哈&#xff0c;我是尝试去找实习&#xff0c;投简历面试去了。 先说一下背景。 目录 背景 求职进行中 简历 投递和沟通 收获和感受 背景 博主&#xff0c;大二软件工程…...

ThreadLocal的使用

1. ThreadLocal介绍 ThreadLocal顾名思义&#xff0c;就是线程的本地变量&#xff0c;只有当前线程可见&#xff0c;对其他线程来说是封闭且隔离的。每一个线程为自己本身创建ThreadLocal变量&#xff0c;只有当前线程可以访问&#xff0c;其他的线程不可以&#xff0c;从根源…...

Java ~ Reference【总结】

一 概述 简介 在JDK1.2之前&#xff0c;Java中引用的定义是十分传统的&#xff1a;如果引用类型的变量中存储的数值代表的是另一块内存的起始地址&#xff0c;就称这块内存代表着一个引用。在这种定义之下&#xff0c;一个对象只有被引用和没有被引用两种状态。 实际上&#xf…...

最快方法求最长上升子序列(LIS)+最长公共子序列(LCS)模板(C/C++)

目录 1 LIS算法&#xff08;最长上升子序列&#xff09; 1.1 简介 1.2 代码 1.3 相关解释 2 LCS算法&#xff08;最长公共子序列&#xff09; 2.1 简介 2.2 代码&#xff08;动态规划&#xff0c;时间复杂度O&#xff08;nlogn&#xff09;&#xff09; 2.3 特殊…...

012+limou+C语言深入知识——(4)“结构体”与“枚举体”与“联合体”

一、结构体 1、结构体基础 &#xff08;1&#xff09;结构体完全声明 struct tag {member-list; }variable-list;//描述一个人 struct people {char name[10];//人名int age;//年龄int idnumber;//身份证 };&#xff08;2&#xff09;结构体不完全声明&#xff08;匿名结构体…...

Canvas百战成神-圆(1)

Canvas百战成神-圆 初始化容器 <canvas id"canvas"></canvas>canvas{border: 1px solid black; }让页面占满屏幕 *{margin: 0;padding: 0; } html,body{width: 100%;height: 100%;overflow: hidden; } ::-webkit-scrollbar{display: none; }初始化画笔…...

详解分库分表设计

详解分库分表设计 背景 ​ 在传统的单机数据库架构中&#xff0c;所有数据都存储在同一个数据库中&#xff0c;随着业务规模的不断扩大&#xff0c;数据量和并发量也会越来越大&#xff0c;这会给数据库的性能和可用性带来挑战。此外&#xff0c;当单机数据库的容量达到瓶颈时…...

动态规划-基础(斐波那契数、爬楼梯、使用最小花费爬楼梯、不同路径、不同路径II、整数拆分、不同的二叉搜索树)

动态规划&#xff0c;英文&#xff1a;Dynamic Programming&#xff0c;简称DP&#xff0c;如果某一问题有很多重叠子问题&#xff0c;使用动态规划是最有效的。所以动态规划中每一个状态一定是由上一个状态推导出来的。动态规划问题&#xff0c;五步走&#xff1a;状态定义&am…...

深入理解WebSocket协议

“ 一直以来对WebSocket仅停留在使用阶段&#xff0c;也没有深入理解其背后的原理。当看到 x x x was not upgraded to websocket&#xff0c;我是彻底蒙了&#xff0c;等我镇定下来&#xff0c;打开百度输入这行报错信息&#xff0c;随即看到的就是大家说的跨域&#xff0c;或…...

Vector的扩容机制

到需要扩容的时候&#xff0c;Vector会根据需要的大小&#xff0c;创建一个新数组&#xff0c;然后把旧数组的元素复制进新数组。 我们可以看到&#xff0c;扩容后&#xff0c;其实是一个新数组&#xff0c;内部元素的地址已经改变了。所以扩容之后&#xff0c;原先的迭代器会…...

22讲MySQL有哪些“饮鸩止渴”提高性能的方法

短连接风暴 是指数据库有很多链接之后只执行了几个语句就断开的客户端&#xff0c;然后我们知道数据库客户端和数据库每次连接不仅需要tcp的三次握手&#xff0c;而且还有mysql的鉴权操作都要占用很多服务器的资源。话虽如此但是如果连接的不多的话其实这点资源无所谓的。 但是…...

10.0自定义SystemUI下拉状态栏和通知栏视图(六)之监听系统通知

1.前言 在进行rom产品定制化开发中,在10.0中针对systemui下拉状态栏和通知栏的定制UI的工作开发中,原生系统的下拉状态栏和通知栏的视图UI在产品开发中会不太满足功能, 所以根据产品需要来自定义SystemUI的下拉状态栏和通知栏功能,首选实现的就是下拉通知栏左滑删除通知的部…...

怎样在外网登录访问CRM管理系统?

一、什么是CRM管理系统&#xff1f; Customer Relationship Management&#xff0c;简称CRM&#xff0c;指客户关系管理&#xff0c;是企业利用信息互联网技术&#xff0c;协调企业、顾客和服务上的交互&#xff0c;提升管理服务。为了企业信息安全以及使用方便&#xff0c;企…...

Activity工作流(三):Service服务

3. Service服务 所有的Service都通过流程引擎获得。 3.1 RepositoryService 仓库服务是存储相关的服务&#xff0c;一般用来部署流程文件&#xff0c;获取流程文件&#xff08;bpmn和图片&#xff09;&#xff0c;查询流程定义信息等操作&#xff0c;是引擎中的一个重要的服务。…...

算法--最长回文子串--java--python

这个算法题里面总是有 暴力解法 把所有字串都拿出来判断一下 这里有小小的优化&#xff1a; 就是当判断的字串小于等于我们自己求得的最长回文子串的长度&#xff0c;那么我们就不需要在进行对这个的判断这里的begin&#xff0c;还可以用来取得最小回文子串是什么 java // 暴…...

ElasticSearch-第二天

目录 文档批量操作 批量获取文档数据 批量操作文档数据 DSL语言高级查询 DSL概述 无查询条件 叶子条件查询 模糊匹配 match的复杂用法 精确匹配 组合条件查询(多条件查询) 连接查询(多文档合并查询) 查询DSL和过滤DSL 区别 query DSL filter DSL Query方式查…...

【AI大比拼】文心一言 VS ChatGPT-4

摘要&#xff1a;本文将对比分析两款知名的 AI 对话引擎&#xff1a;文心一言和 OpenAI 的 ChatGPT&#xff0c;通过实际案例让大家对这两款对话引擎有更深入的了解&#xff0c;以便大家选择合适的 AI 对话引擎。 亲爱的 CSDN 朋友们&#xff0c;大家好&#xff01;近年来&…...

美团笔试-3.18

1、捕获敌人 小美在玩一项游戏。该游戏的目标是尽可能抓获敌人。 敌人的位置将被一个二维坐标 (x, y) 所描述。 小美有一个全屏技能&#xff0c;该技能能一次性将若干敌人一次性捕获。 捕获的敌人之间的横坐标的最大差值不能大于A&#xff0c;纵坐标的最大差值不能大于B。 现在…...

【12】SCI易中期刊推荐——计算机信息系统(中科院4区)

🚀🚀🚀NEW!!!SCI易中期刊推荐栏目来啦 ~ 📚🍀 SCI即《科学引文索引》(Science Citation Index, SCI),是1961年由美国科学信息研究所(Institute for Scientific Information, ISI)创办的文献检索工具,创始人是美国著名情报专家尤金加菲尔德(Eugene Garfield…...