(一)初识
什么是程序,什么是进程,区别又是什么?
程序是静态的概念,进程是执行,比如说程序跑起来了就叫做多出了一个进程。
如何查看系统中有哪些进程?
使用PS指令查看,
ps -aux|grep splash使用以上指令查看系统中的特定进程(splash)
使用top指令查看系统的进程(类似于windows下的任务管理器)
什么是进程标识符?
c程序的存储空间是怎么分配的?
(二)、创建进程
执行以上程序发现printf函数被调用了2次,就说明了原来的进程调用了一次printf函数,用fork函数创建一个新的进程又调用了一次printf函数。
以下图片验证以上过程:
创建进程有两种方式:一种是fork()函数,另外一个是vfork()函数,
区别:
1、vfork()直接使用父进程存储空间,不拷贝
2、保证子进程的优先使用,当子进程调用exit退出后,父进程才执行
循环结构中break、continue、return和exit的区别_跳出当前for循环-CSDN博客
调用exit()函数将会结束当前进程,同时删除子进程所占用的内存空间,把返回信息传给父进程。当exit()中的参数为0时,表示正常退出;
如果不用exit()正常退出子进程的话,子进程某些变量会被破坏。
子进程退出状态不被收集,会变成僵死进程。如下:
(三)父进程等待子进程退出
在父进程里面调用wait()函数等待子进程退出(此时父进程为阻塞状态),子进程结束后父进程提取其状态码就可知子进程做到哪一步退出的。
wait()函数使调用者阻塞,waitpid()函数中的options中的参数可以使得调用者不阻塞
waitpid()函数的用法请见:Linux中waitpid()函数的用法_linux waitpid函数用法-CSDN博客