linux进程

linux进程包含如下几个方面:
1:进程的控制(创建,等待子进程终止,执行程序,退出)
2:守护进程(什么是守护进程,守护进程的创建方式)
3:进程间的通信(管道,消息队列,消息,socket,共享内存)
4:进程间的同步(互斥锁,信号量,读写锁,文件锁)

关于fork函数你必须要知道的事情:

fork是一次调用,两次返回,根据返回值区别是子进程还是父进程。
而且fork生成的子进程是复制父进程的数据空间,栈,堆,以及文件句柄(注意是复制不是共享),所以linux采用COW技术,避免性能的浪费。
还有一个fork的进化版本,vfork函数,该函数用于创建一个子进程,而且该进程会立即执行exec操作,启动一个新的程序,所以其会共享父进程地址空间(不会产生复制开销),而且vfork会保证子进程的优先执行,直到其被调用exce或者exit后父进程才能执行。
clone函数可以选择性的复制父进程的资源,因此clone是创建线程的函数

int clone(int (*fn)(void *), void *child_stack, int flags, void *arg);

这里fn是函数指针,我们知道进程的4要素,这个就是指向程序的指针, child_stack明显是为子进程分配系统堆栈空间,flags就是标志用来描述你需要从父进程继承那些资源, arg就是传给子进程的参数)。

关于进程的退出:

进程的终止方式比较多,包括函数return返回,或者调用exit退出,
而如果是多线程的进程的话,则最后一个线程的终止或者是调用exit退出会导致进程的退出。
进程的异常终止方式又分为三种:abort函数调用,还有收到异常信号,还有就是最后一个线程对取消请求作出响应。
注意:return函数在系统内部也是调用exit函数,而exit函数再调用_exit函数完成真正的退出操作,_exit不会清理缓冲区,会造成数据流失。
进程调用exit退出,会将退出代码存储到PCB中,然后发送SIGCHLD信号给父进程,自身成为僵尸进程,如果父进程调用wait函数则收到信号后会清除子进程的内存空间。
而如果父进程提前退出,则子进程会成为孤儿进程,孤儿进程由init进程托管。而init进程被设置为:无论哪个孤儿进程终止,init进程都会调用wait函数取得其终止状态,从而防止了大量孤儿进程的产生。

父进程如何知道子进程退出的呢?

父进程可以调用wait函数或者是waitpid函数(二者的区别在于:wait是只要有子进程退出就会处理,而waitpid会等待指定的子进程退出)

而wait函数的过程如下:
如果有子进程已经退出,则立即获取子进程的退出状态,并返回。而如果所有子进程都在运行则阻塞等待。如果没有子进程自然就出错返回了。

还有一个很重要的函数exec
执行一个新的程序,参数必须有三种:
1:可执行文件路径
2:参数
3:环境变量
exec族函数有多种变形,其实都是对这三种参数的变化:
比如可执行文件又分为相对路径和绝对路径
参数又分为,可以直接传递多个变长参数(以空指针结尾)或者是将参数放置于一个数组中。
还有环境变量,可以使用进程原有的环境变量,也可以将环境变量传递给函数。

linux的守护进程

什么是守护进程:守护进程随系统开机而启动,并且只能在系统关闭时终止,所以守护进程会在系统后台运行。
如何创建守护进程:看书

你可能感兴趣的:(linux进程)