1.进程标识
每个进程都有一个非负整型标识的唯一进程id。进程id可复用。当一个进程终止后,其进程id就成为复用的候选者。查看task_struct结构可以发现,表示进程的结构体中有两个成员pid和tgid,pid是内核自己维护的进程号,因为在Linux中线程是由进程实现的,用户看到的进程号是tgid域,这个是线程组号,和线程组内的领头进程的进程号一致,我们在用户程序中调用getpid()其实返回的是tgid值。
2.系统中的专用进程
- id为0的进程通常是调度进程(也被称为swapper)。该进程是内核的一部分,它并不执行任何磁盘上的程序,因此也被称为系统进程。
超级用户特权运行。
3.查看进程中相关标识符操作
#include <unistd.h> pid_t getpid(void); 返回值:调用者的进程id,(其实是tgid); pid_t getppid(void); 返回值:调用者的父进程的id; uid_t getuid(void); 返回值:调用进程的实际用户id; uid_t geteuid(void); 返回值:调用进程的有效用户id; uid_t getgid(void); 返回值:调用进程的实际组id; uid_t getugid(void); 返回值:调用进程的有效组id;
4.创建进程(重点)
#include<unistd.h>
pid_t fork(void); //返回值:子进程返回0,父进程返回子进程id;若出错,则返回-1
Linux3.2.0提供了另一种新进程创建函数-clone:它允许调用者控制哪些部分由父进程和子进程共享。
注意:
子进程是父进程的副本。譬如,子进程获得父进程数据空间、堆和栈的副本。父进程和子进程并不共享这些存储空间部分,父进程和子进程共享text area
5.写时复制技术
略
6.fork与I/O函数之间的交互关系
略
7.文件共享
fork之后处理文件描述符的常用情况:
- 父进程等待子进程完成。在这种情况下,父进程无需对其描述符做任何处理。当子进程终止后,它曾进行过读、写操作的任一共享描述符的文件偏移量已经更新
- 父进程和子进程各自执行不同的程序段。在这种情况下,在fork之后,父进程和子进程各自关闭他们不需要使用的文件描述符(互不干扰)。比如(网络服务器)
父子进程的区别:
1.fork的返回值不同
2.进程id不同,父进程id不同
3.子进程的tms_utime,tms_stime,tms_cutime和tms_ustime的值设置为0
4.子进程不继承父进程设置的文件锁
5.子进程的未处理闹钟被清除
6.子进程的悬而未决信号集设置为空集