本文共 1374 字,大约阅读时间需要 4 分钟。
每个进程都有一个非负整型标识的唯一进程id。进程id可复用。当一个进程终止后,其进程id就成为复用的候选者。查看task_struct结构可以发现,表示进程的结构体中有两个成员pid和tgid,pid是内核自己维护的进程号,因为在Linux中线程是由进程实现的,用户看到的进程号是tgid域,这个是线程组号,和线程组内的领头进程的进程号一致,我们在用户程序中调用getpid()其实返回的是tgid值。
超级用户特权运行。
#includepid_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;
一个现有进程可以调用fork函数创建一个新的进程
#include<unistd.h>
pid_t fork(void); //返回值:子进程返回0,父进程返回子进程id;若出错,则返回-1
Linux3.2.0提供了另一种新进程创建函数-clone:它允许调用者控制哪些部分由父进程和子进程共享。
注意:
子进程是父进程的副本。譬如,子进程获得父进程数据空间、堆和栈的副本。父进程和子进程并不共享这些存储空间部分,父进程和子进程共享text area
略
略
fork之后处理文件描述符的常用情况:
父子进程的区别:
1.fork的返回值不同
2.进程id不同,父进程id不同
3.子进程的tms_utime,tms_stime,tms_cutime和tms_ustime的值设置为0
4.子进程不继承父进程设置的文件锁
5.子进程的未处理闹钟被清除
6.子进程的悬而未决信号集设置为空集