两个进程间想通讯,必须要通过内核,今天讲的信号其实本质也是讲进程间通讯的意思,那么你为什么可以在shell环境下,可以和一个进程发kill-9啊?
shell是不是相当于一个进程?你自己运行的那个进程是不是也相当于一个进程?这样的话,是不是一个进程给另外一个进程发送信号啊?他本质上也是进程间通讯,也是需要通过内核,
作业,在父子进程间执行,psux的命令啊?
在兄弟进程间,完成这么一个功能,同时增加别的功能
父进程里面是不是需要回收啊?回收子进程,
这个代码你看一下你到底哪里没写出来
我们完成的功能是psux groupby里面的命令吧?
所以说咱们应该是在创建子进程之前应该创建一个管道啊?这样的话,fork出这两个子进程以后呢?这两个子进程是不是都可以使用这两个管道了啊?
实际上在使用管道的时候呢,是不是就使用了两个文件描述符啊?我们操作管道是不是其实就是操作两个文件描述符的?
在循环里面创建了两个子进程,在36为什么加break?
为了让子进程不再去fork子进程,
循环创建两个子进程,
这个wpid>0 这个是不是表示子进程已经死掉了,至少死掉了一个,至少你可以调用这个宏打印一下他的退出状态,65--71
父进程做的事情就是这么些个,这一块咱们前面是不是写过两三次了?
第一个子进程 i==0 79 我们的目的是让他往管道里面写吧?他执行ps aux 这个命令 这一个和接下来的这一块,是不是和咱们前面讲的那个图是一模一样的?只不过是把那个父进程变成子进程吧?
所以说他用哪端就留哪端,不用哪端就关闭哪端,在这他用的是管道的写端,所以他关闭的是管道的读端,
他执行的dup2这个函数 是不是可以实现文件重定向啊?文件重定向和文件描述符的复制,本身上是不是一个意思啊?两个说法而已
那么他要将谁重定向谁?是不是应该是把标准输出重定向到管道的写端啊?所以这一步操作就是干这一个事情的,这一步操作是不是前面咱们说过两三次了?还记的将标准输出重定向到文件当中去吗?那个只不过fd[1]是一个open打开的一个文件啊?在这他是个管道 本质上是不是一样的啊?
在这执行了一个命令 execlp这个命令 86,这个命令内核当中所做的操作是不是其实是将ps这个命令他的代码端,是不是替换掉了,当前这个子进程的代码段啊?如果说这个函数执行成功,后面perror这个函数还能执行吗 87 89?不能执行了,其实 如果成功 后面这个相当于废话,冗余代码 后面可以没有,那是不是不用写了?因为他有可能失败,那你比如说你这个ps你写错了,或者你的参数不对,都有可能会报错,出于习惯你把这个写上 89
万一报错的话,你是不是可以看到啊?如果你不写你就不知道了,
看第二个子进程,i==1 第二个子进程 很显然是不是他要执行管道右边的group bash的命令啊?
所以说在这呢也应该是做重定向操作吧?当然用哪端留哪端,不用哪端关哪端,在这他是不是用读端?所以他关掉了写端,接下来是不是和咱们前面讲过的一模一样了?
然后他也做了一个重定向,后面来执行一个命令,这个execlp一定要会用100
这个函数其实execlp还可以被这个execl函数代替啊?
如果你代替之后,那么你第一个参数是不是要加路径了?怎么查看这个命令的路径啊 which
你这个用命令查的话,是不是只能查这个系统命令的这个路径,你能查这个普通用户写的这个应用程序的路径吗?查不了了,
这个代码应该说有一定的综合性,在这里咱们综合用到了 创建管道, fork 循环创建子进程的时候需要你注意的事项,
父进程回收子进程 waitpid waitpid 函数的使用,务必要搞清楚
还有这几个状态的宏65 71 这几个状态的宏你记不住,你就查,man waitpid
文件重定向操作,在一个子进程里面执行另一个命令,另一个系统命令,或者是应用程序的函数,execl的函数,
综合应用了这些东西,应该是这个代码应该说这个如果大家掌握了咱们前面讲过的那个父子进程间完成ps aux 这样的一个命令的话呢,那么我想在兄弟之间完成也不难,而且咱们这个wpid是不是前面也学过了?如何让父进程回收子进程?大致也会了,其实就是两段代码一组合就可以了?
看懂代码之后,看看是否符合自己的需求,不符合的话,拿过来大概改一改,就可以用了,一般就这么用的,很少会让你从零开始写,即便是从零开始写,我想的话,应该是会有大概的模板,比如说这个代码和这个代码类似,你照着他写就可以了,一般这么来写,如果说研发一个产品的话,从零开始写,那么周期会很长,
他能够用现实的东西,比如说库函数,现成的类等等,他就用现成的,
共享映射区,他的实现原理,将文件内容映射到共享映射区,那么这样的话,你再操作这块内存是不是就相当于操作这个文件啊?那么我们这个共享映射区其实就是一共有两个类,一个是MAP_SHARED 一个是MAP_PRIVATE那其中MAP_SHARED是不是能够将修改内存的数据反应到文件当中去?但是MAP_PRIVATE就不行了,一般时候用的话,就用MAP_SHARED就可以了,
这个关于mmap函数的用法,咱们就不过多的说了,那么这个函数呢,虽然说参数比较多,但是很多参数都是有固定写法的,那么唯一有那么一两个让你准备的 是不是就那个文件描述符了?还有文件大小,其他的要你准备吗?都是现成的,直接填就可以了,mmap他不但能够完成父子进程间,或者兄弟进程间,也就是有血缘关系的进程间通讯,是不是也能够完成没有任何关系的两个进程间通讯啊?当然你要想让他完成任何两个进程通讯的话,必须有一个文件,
还有一个匿名映射,大家了解一下就可以了,匿名映射是不是只能运用于有血缘关系的进程间通讯啊?因为他没有文件,如果两个毫不相干的进程,他就没有联系的纽带,
那么关于这个fifo 是不是更简单了?fifo是不是你得用一个文件啊?管道文件,这个管道文件是不是咱们操作系统里面的系统文件类型是一样,第一个字母是p 那么这样的话,必须是文件,那么两个进程通过打开一个共同的文件来操作这个管道,
基本上复习的文件就这么多
熟练使用信号捕捉函数 sigaction 重点掌握
熟练使用信号捕捉函数 sigrtal 这个不能跨平台移植,只能在linux上使用,在其他系统中呢,他表现的行为有所区别,
sigaction都是一样的,可移植的
你在linux写这个用这个,那么你拿到unixs上不做任何修改,也可以,但是用sigrtal这个的话就不一定了
熟练掌握使用信号完成子进程的回收 是本章的重点,
前面讲回收,是不是父进程在一个循环里面去循环回收啊?那么循环回收还能做其他的事情吗?是不是做不了啊?这儿就可以了