嵌入式学习DAY26 --- 进程间通信(管道(有名,无名),信号,共享内存)_无名管道wait函数

给大家的福利

零基础入门

对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。

同时每个成长路线对应的板块都有配套的视频提供:

在这里插入图片描述

因篇幅有限,仅展示部分资料

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化资料的朋友,可以点击这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

四、无名管道
五、有名管道
六、信号
七、使用有名管道,实现聊天(代码实现)

笔记:

特殊的进程:

1.孤儿进程
父进程先于子进程退出,子进程被init进程收养,子进程被称为孤儿进程

2.僵尸进程
在僵尸态的进程,子进程退出后,父进程没有回收子进程的资源


一、进程资源的回收问题

如何避免僵尸进程的产生,即子进程退出后,父进程回收子进程的资源。

回收的手段:
wait()和waitpid()的功能:等待进程状态的改变

1.wait()
#include <sys/types.h>
			#include <wait.h>
			/\*
 \*函数名:wait
 \*函数功能:阻塞的等待一个子进程退出状态,如果父进程有多个子进程,则返回随机接收的一个
 \*函数参数: int \*status:存储的是返回状态,exit(status)中status \* 2^8
 \*函数返回值:成功返回接收到的子进程的进程号
 \*/
			pid_t wait(int \*status);

2.waitpid()
#include <sys/types.h>
		#include <wait.h>
		/\*
 \*函数名:waitpid
 \*函数功能:接收指定进程的退出状态
 \*函数参数: int \*status:存储的是返回状态,exit(status)中status \* 2^8
 \*函数返回值:成功返回接收到的子进程的进程号
 \*/
		pid_t wait(pid_t pid, int \*status, int options);

3.wait和waitpid的区别:

1.wait是阻塞的,waitpid可以设置阻塞还是非阻塞

2.在多个子进程的情况下,wait接到的退出状态是随机的,而waitpid可以指定接哪个子进程的退出状态

3.两个函数都有回收资源的功能

4.wait是在waitpid基础上封装的

5.为了避免遗露,建议使用waitpid


二、守护进程

1.让进程从电脑开机一直到电脑关机一直运行
2.不能让进程被普通用户轻易杀死,不要让进程受到中断控制

实现上述两个功能的进程,称之为守护进程。
在这里插入图片描述

1.如何创建守护进程

核心问题:如何摆脱终端控制
终端和进程之间的关系

2.特殊概念
(1)终端:

用户和操作系统交互的接口,称为终端,传统的终端是一个硬件设备。
在Linux系统中,给用户提供了连接七个终端设备的接口,我们称之为终端。

终端的分类:

真终端:操作系统提供的终端
Linux中,终端有:tty1-tty7
字符界面终端:tty1-tty6
图形化界面终端:tty7

终端的切换:
ctrl + alt + F1 + (Fn)
F2/3/4/5/6
ctrl + alt + F7

伪终端:使用软件模拟的终端
Terminal: ctrl + alt + t
超级终端/putty
pts/开头

(2)进程组:

PGID(进程组ID)
只要PGID一致,则就在一个进程组内

标题会话组:

SID(会话组ID)
只要SID一致,则就在一个会话期内

3.如何创建守护进程

<1>fork()创建子进程,exit()父进程退出
<2>setsid()创建新会话,把自己设置为新会话的组长
<3>更改工作路径
<4>重设文件权限掩码
<5>关闭不需要的文件描述符

setsid:
#include <unistd.h>
		/\*创建新会话,把自己的pid设置为会话组id\*/
		pid_t setsid(void);

chdir
#include <unistd.h>
		/\*
 \*函数名:chdir
 \*函数功能:更改进程的工作路径
 \*函数参数:const char \*path:相要更改的路径
 \*函数返回值:int:成功返回0,失败返回-1
 \*/
		int chdir(const char \*path);

umask
#include <sys/types.h>
		#include <sys/stat.h>
		/\*
 \*函数名:umask
 \*函数功能:设置文件的权限掩码
 \*函数参数:mode\_t mask:八进制类型的掩码,默认0002
 \*函数返回值:mode\_t:不会失败,返回值位文件权限掩码
 \*/
		mode_t umask(mode_t mask);

getdtablesize
#include <unistd.h>
		//得到进程的文件描述符表的大小
		int getdtablesize(void);


三、进程间通信

进程间通信机制:

Unix传统进程间通信方式

无名管道
有名管道
信号

Unix System V进程间通信方式

System V 共享内存
System V 信号量
System V 消息队列

POSIX IPC 进程间通信方式

IPC 共享内存
IPC 信号量
IPC 消息队列

BSD 进程间通信机制

socket通信


四、无名管道

1.无名通道的特点

无名管道是Linux中管道通信的一种原始方法,它具有如下特点:

(1)只能在具有亲缘关系的进程间使用(父子进程/兄弟进程间的通信)
(2)是一个半双工的通信模式,具有固定的读端和固定的写端
(3)管道也可以看成是一种特殊的文件,对于它的读写也可以使用普通的read()/write()等函数,但是它不属于任何文件系统,并且只存在于内存中。

2.对于通信方式的划分

单工通信:
只能单向通信的方式

半双工通信:
同一时刻只能单向通信,但是可以通过时分复用信道的方法实现双向通信。

全双工通信:
同一时刻可以实现双向通信
在这里插入图片描述

3.管道读写注意点:

(1)只有在管道的读端存在时,向管道写入数据才有意义,否则,向管道写入数据的进程将收到内核传来的SIGPIPE信号(通常时Broken Pipe错误),即管道破裂。

(2)向管道写入数据时,Linux将不保证写入的原子性,管道缓冲区只要有空间,写进程就会适度向管道写入数据。如果管道缓冲区已经满了,那么写操作将会一直阻塞。

(3)父子进程在运行时,他们的先后次序并不能保证。为了确保父子进程已经关闭了相应的文件描述符,可在两个进程中调用sleep()函数。当然,这种调用不是很好的解决方法。

(4)读阻塞,管道中没有数据,这时去读取数据,就会阻塞。

4.无名管道的创建
pipe
/\*需要包含的头文件\*/
	#include <unistd.h>
	/\*
 \*函数名:pipe
 \*函数功能:创建一个无名管道pipe
 \*函数参数:int pipefd[2]: pipefd用来存储操作管道的文件描述符
 \* pipefd[0]:读端 pipefd[1]:写端
 \*函数返回值:int:成功返回0,失败返回-1
 \*/
	int pipe(int pipefd[2]);

5.无名管道的读写

read fd[0] 读端
write fd[1] 写端

6.无名管道的关闭

close

7.注意

1.pipe函数一定要放在fork上面,要不然会pipe两次,导致父子进程各操作各的无名管道。会实现不了通信。

8.设置文件为非阻塞:
int flags = fcntl(fd, F_GETFL);
		if(flags < 0 || fcntl(fd, F_SETFL, flags | O_NONBLOCK) < 0)
		{
			perror("fcntl");
			close(fd);
			return -1;
		}

9.fcntl函数:
#include <unistd.h>
		#include <fcntl.h>
		函数功能:用来控制文件描述符的
		函数参数:
			int fd:被控制的文件描述符
			int cmd:控制命令
			.../\*arg\*/:可变参数(可有可无)
		函数返回值:
		int fcntl(int fd, int cmd, ... /\* arg \*/ );


cmd:
F_GETFL:获取文件描述符的状态
F_SETFL:设置文件描述符的状态
在使用F_SETFL时,会使用到arg,arg常用的参数有:
O_NONBLOCK:非阻塞I/O
O_ASYNC:异步I/O


五、有名管道

1.有名管道的特点:

有名管道(FIFO)是对无名管道的一种改进,它具有如下特点:
(1)它可以使互不相关的两个进程实现彼此通信

(2)该管道可以通过路径名来指出,并且在文件系统中是可见的。在建立管道之后,两个进程就可以把它当作普通文件进行读写,使用非常方便。

(3)FIFO严格遵循先进先出原则,对管道及FIFO的读总是从开始处返回数据,对它们的写则把数据添加到末尾。有名管道不支持如lseek()等文件定位操作。

2.如何创建有名管道:
mkfifo
#include <sys/types.h>
			#include <sys/stat.h>
			/\*
 \*函数名:mkfifo
 \*函数功能:创建一个有名管道
 \*函数参数:
 \* const char \*pathname:有名管道的文件名
 \* mode\_t mode:文件权限
 \*函数返回值:int:成功返回0,失败返回-1
 \*/
			int mkfifo(const char \*pathname, mode_t mode);

mknod<管道文件名> p

例子:
mknod myfifo p

如何自学黑客&网络安全

黑客零基础入门学习路线&规划

初级黑客
1、网络安全理论知识(2天)
①了解行业相关背景,前景,确定发展方向。
②学习网络安全相关法律法规。
③网络安全运营的概念。
④等保简介、等保规定、流程和规范。(非常重要)

2、渗透测试基础(一周)
①渗透测试的流程、分类、标准
②信息收集技术:主动/被动信息搜集、Nmap工具、Google Hacking
③漏洞扫描、漏洞利用、原理,利用方法、工具(MSF)、绕过IDS和反病毒侦察
④主机攻防演练:MS17-010、MS08-067、MS10-046、MS12-20等

3、操作系统基础(一周)
①Windows系统常见功能和命令
②Kali Linux系统常见功能和命令
③操作系统安全(系统入侵排查/系统加固基础)

4、计算机网络基础(一周)
①计算机网络基础、协议和架构
②网络通信原理、OSI模型、数据转发流程
③常见协议解析(HTTP、TCP/IP、ARP等)
④网络攻击技术与网络安全防御技术
⑤Web漏洞原理与防御:主动/被动攻击、DDOS攻击、CVE漏洞复现

5、数据库基础操作(2天)
①数据库基础
②SQL语言基础
③数据库安全加固

6、Web渗透(1周)
①HTML、CSS和JavaScript简介
②OWASP Top10
③Web漏洞扫描工具
④Web渗透工具:Nmap、BurpSuite、SQLMap、其他(菜刀、漏扫等)
恭喜你,如果学到这里,你基本可以从事一份网络安全相关的工作,比如渗透测试、Web 渗透、安全服务、安全分析等岗位;如果等保模块学的好,还可以从事等保工程师。薪资区间6k-15k

到此为止,大概1个月的时间。你已经成为了一名“脚本小子”。那么你还想往下探索吗?

如果你想要入坑黑客&网络安全,笔者给大家准备了一份:282G全网最全的网络安全资料包评论区留言即可领取!

7、脚本编程(初级/中级/高级)
在网络安全领域。是否具备编程能力是“脚本小子”和真正黑客的本质区别。在实际的渗透测试过程中,面对复杂多变的网络环境,当常用工具不能满足实际需求的时候,往往需要对现有工具进行扩展,或者编写符合我们要求的工具、自动化脚本,这个时候就需要具备一定的编程能力。在分秒必争的CTF竞赛中,想要高效地使用自制的脚本工具来实现各种目的,更是需要拥有编程能力.

如果你零基础入门,笔者建议选择脚本语言Python/PHP/Go/Java中的一种,对常用库进行编程学习;搭建开发环境和选择IDE,PHP环境推荐Wamp和XAMPP, IDE强烈推荐Sublime;·Python编程学习,学习内容包含:语法、正则、文件、 网络、多线程等常用库,推荐《Python核心编程》,不要看完;·用Python编写漏洞的exp,然后写一个简单的网络爬虫;·PHP基本语法学习并书写一个简单的博客系统;熟悉MVC架构,并试着学习一个PHP框架或者Python框架 (可选);·了解Bootstrap的布局或者CSS。

8、超级黑客
这部分内容对零基础的同学来说还比较遥远,就不展开细说了,附上学习路线。
img

网络安全工程师企业级学习路线

img
如图片过大被平台压缩导致看不清的话,评论区点赞和评论区留言获取吧。我都会回复的

视频配套资料&国内外网安书籍、文档&工具

当然除了有配套的视频,同时也为大家整理了各种文档和书籍资料&工具,并且已经帮大家分好类了。

img
一些笔者自己买的、其他平台白嫖不到的视频教程。
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化资料的朋友,可以点击这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 30
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值