c语言基础(十三)

1、进程结束后资源处理的问题
每一个进程结束之后都会涉及到资源清理的问题:资源1:操作系统会回收里的进程中涉及到资源(栈、堆(malloc)、文件IO);资源2:进程建立时,会自动产生一个task_struct(8KB),这个就是你这个当前进程
包含所有信息的一个结构体(来自于父进程),这个结构体相当于(文件描述符),他是进程描述符。存在于进程管理表中,这里的资源操(进程运行也是需要栈)作系统无法给你回收,只能由他的父进程回收。
2、僵尸进程
前情提要:子进程先结束,父进程(知道)不一定立刻给这个子进程”收尸”,父子进程间(回收资源)是异步通信的。子进程已亡,父进程尚未给其”收尸”,此时这个进程就是僵尸进程。子进程此刻只有task_struct(8KB)和进程运行的栈,未被释放。
回收资源:(1)父进程可以调用wait或者waitpid对子进程的资源进行回收。(2)linux设计的时:如果没有函数进行回收子进程资源,父进程在自己结束后会自动释放子进程资源。
3、孤儿进程
前提:父进程先于子进程结束,此时子进程就是一个孤儿进程(尚未结束)。这个子进程就会被init(进程1)收养,相当于子进程有了父亲。
4、wait和waitpid
wait原理:
(1)子进程先结束,会发一个信号SIGCHLD.
(2)父进程调用wait收尸,如果子进程没有结束,就一直在等,会阻塞在这里。
(3)有资源回收函数,信号发给父进程,此时就可以回收(僵尸进程),父进程可以及时回收资源。没有资源回收函数,什么时候回收资源,父进程安排,通信是异步通信的。
(4)父进程没有子进程的情况,wait返回值错误。
waitpid:
(1)回收子进程资源
(2)可以指定特定的pid值(特定进程)
(3)设置阻塞或者非阻塞模式
pid_t waitpid(pid_t pid, int *status, int options);
参数:options 设置函数阻塞或者非阻塞的模式 (1)WNOHANG非阻塞 (2)0(零)阻塞
验证:PS:子进程、父进程,谁先运行,不规定;一旦有了父wait,肯定是我们子进程先结束。
system函数
PS:题目:
一个父进程,该父进程创建的两个子进程,其中一个子进程执行“ls -l”命令,
另一个子进程在5s之后发一个闹钟信号(执行闹钟信号处理函数)正常退出。
父进程用阻塞方式等待第一个子进程的结束,然后用非阻塞方式等待另一个子进程的退出,
待收集到第二个子进程结束的信息,父进程就返回。
总结:1、每一个独立的进程结束之后,最好由return exit _exit正常结束。2、每一独立的进程里面时运行一个应用程序的。
5、exec族
(1)execl 和 execv
完成函数里的程序调用后(切换进程了,此进程(ls -l)调用完就结束整个进程(子进程直接结束了)),此进程
(子进程)其他的代码都不会执行。这个路径,可以是全路径,也可以是相对路径。
(2)execlp 和 execvp
优先在PATH环境变量下,找,如果没有找到就去当前目录找;可执行文件可以不加路径
(3)execle
e就是环境变量,将来你的程序需要环境变量,就可以向这个数组里写(你自己的环境变量), 代替之前系统默认的那一托(环境变量)。

前情提要:写父进程写文件(“123”),子进程读文件(“123”), 普通文件在父子进程间的通信。
6、linux下主流的进程通信方式:无名管道、有名管道、信号、消息队列、共享内存、信号量、网络
无名管道:1、文件系统下不可见,但是可以通信(read/write) 2、用于父子进程
原理:有一个管道(文件), 父子进程中都一个读端和写端。双方都可以写,也都可以读,半双工通信。
有名管道:(1)、可见的,但是当通信结束,里面没有内容(2)、先进先出,不支持lseek(文件指针定位)。
(3)、可以是父子件进程,也可以是毫不相干(陌生的)进程之间通信。
遇到的问题:写的(进程)一方写进出之后,管道关闭,通信就结束了。所以读端(进程),就再也读不到了,卡在read函数处。

猜你喜欢

转载自blog.csdn.net/linzetao233/article/details/80226968
今日推荐