目录
进程概念:
1.什么是进程,跟程序又有什么关系?
进程是静态的,如电脑桌面的QQ就是一个程序,进程是程序的一次运行活动,程序跑起来后系统就多了一个进程。
2.如何查看系统中有那些进程?
使用ps指令或top指令查看。
3.什么是进程标识符?
一个非复整数表示的唯一ID号叫PID 通过 getpid()可以获取自身标识符 ,getppid()可以获取父进程标识符。
4.什么是父进程,什么是子进程?
程序A创建了程序B 那么A就是父进程 B就是子进程。
5.C程序的储存空间如何分配
fork创建进程:
调用fork函数创建进程 调用成功返回两次 返回值大于0 那么代表是父进程 ,返回值==0代表子进程,调用失败返回-1.
使用fork函数创建子进程以后 子进程会拷贝一份父进程的存储空间
也就是说父进程和子进程都会有上面这段图片的代码 当我们在子进程把a的值给改了之后,父进程a的值是不会改变的。
很显然父进程的值还是10,而子进程a的值已经变成了110。
vfork创建进程:
vfork与fork的区别就是:
1.vfork直接使用父进程存储空间,不拷贝。
2.vfork保证子程序先运行,当子程序调用 exit( )退出后,父进程才执行。
调用vfork 很显然子进程运行结束后 父进程在执行,而且在子进程改变的c的值在父进程同样会改变。
创建子进程的目的:
1.服务器在收到连接请求时,创建子进程对接。
2.一个进程要执行一个不同的程序。
exec 配合fork使用: 当父进程检测到输入为1的时候 创建子进程把配置文件TEST的字段修改掉。
execl("可执行文件的路径","执行文件的名字","传递的参数(不传参就写NULL)",NULL);
当然也可以用system 因为system本来就是exec封装起来的:
使用 system ()的话子进程的程序运行完后会回到原来的程序。但是使用 exec() 的话不会返回到原来的程序中,也就是说子进程的程序运行完后如果exec后面还有代码是不会执行的。
popen 与system对比:
popen可以获取运行的输出结果。
比如用system运行ps 当我们想获取其中的数据的时候是没办法获取的 ,同样的我们用popen运行ps的时候可以用fread读取其中的数据,甚至还可以把读取出来的内容写入文件里面。
PATH环境变量:
path环境变量一般是指在操作系统中用来指定操作系统运行环境的一些参数,如:临时文件夹位置和系统文件夹位置等。
当我们在文件执行程序时必须通过 ./a.out 才能执行程序 而且换个目录之后程序就执行不了。
我们可以通过export 把可执行的文件的位置配置到环境变量里:
这样的话运行程序的时候不用 ./ 也能运行程序 而且就算换一个目录也能执行程序:
进程退出:
正常退出:
- main函数调用return
- 调用exit( )
- 调用_exit ( )或者_Exit ( )
异常退出:
- 调用abort
- 由信号终止 如 Ctrl+c
等待子进程退出:
等待进程退出的目的就是为了收集进程退出的状态:如是正常退出 还是异常退出。
我们可以通过 wait( ) 来收集exit(3)中3这个退出码:
当然在打印status这个值的时候要用WEXITSTATUS这个宏修饰一下不然打印的数值与exit里面的退出码不相符。
如果不关心退出的状态可以用wait(NULL),如果不用wait()进程会变成僵尸进程