获取进程的父进程号PPID,进程号PID,真实用户ID,进程有效用户EUID,进程组好PGID
进程控制:
fork的实例:
打印结果:
虽然main程序里面只有一个printf("byte!\n");,但是却打印了两遍,这个应该就是父子进程都会执行。
fork()是一个拷贝父进程的副本,从而拥有自己独立的代码段、数据段以及堆栈空间,即成为一个独立的实体,而vfork是共享父进程的代码以及数据段。
对于fork(),对于文件描述符则是以共享的方式使用。
运行新进程:
调用execv()并不创建新进程,所以前后的进程号不变, exec只是用新程序替换了当前进程的正文、数据、堆和栈段。
system()用来创建新进程,执行给定的shell命令:
wait()等待任意一个子进程结束,将返回当前结束的子进程的PID, 同时将返回的状态存储在”__stat_loc“变量中。如果执行失败则返回-1,错误原因在errno中
判断返回状态:
等待某个进程结束:
等待子进程更新状态:
父进程对子进程进行跟踪:
退出进程:
在Linux下,可以通过以下方式结束进程:
像exit()或_exit()发布一个调用。
在main函数中发布一个return
隐含的离开main函数
abort()终止程序
atexit() 退出进程
on_exit()正常退出进程前调用的函数。
exit()用来结束当前进程的执行,并把参数status返回给父进程,而进程所有的缓冲区数据会自动写回并关闭文件。
比较诧异的输出:
这是为什么呢?不应该是output
content in buffer 吗?
不是,其只会输出output,将程序修改一下如下,看输出又是什么?
输出结果:
由此看出其会输出直至“\n”为止,这是因为_exit()不会处理标准i/o缓冲区,如果要更新需要调用exit(),由此我们一定要非常小心了,以后在调试的时候,不能够随便相信printf输出,万一没有输出来,岂不是惨的很深...
来源: http://lib.csdn.net/article/linux/44861