一、什么是进程
进程:进程是一个多任务操作系统,在同一时间,可以有多个进程同时执行。进程是资源分配的最小单元。
进程ID(PID):用来区分进程。
父进程和子进程:两者的关系是管理和被管理的关系。当父进程被终止时,子进程也随之终止;但是子进程终止,父进程并不一定终止。
常用命令:ps -auxf
a:显示用户所有的进程。
u:按照用户名和启动时间顺序显示进程。
x:显示无控制终端的进程。
f:用树状格式来显示进程。
二、进程的创建:
1、获取进程
getpid(void) 取得执行目前进程的组识别码。
getppid():获得父进程的pid。
2、启动进程
(1)fork(void):创建新的进程。
fork()创建一个进程时,子进程只是完全复制父进程的资源,复制出来的子进程拥有自己的结构和pid,但却复制父进程的其他所有资源。fork()调用执行一次返回两个值,父进程返回子进程的pid,子进程返回0。
子进程结束需要加上exit()函数。
(2)vfork(void):建立一个新的进程。
创建的子进程会共享继承父进程的资源。父进程返回子进程pid,子进程返回0.
(3)exec族
execl():执行文件,最后一个都必须以NULL结尾
execl(const char *path,const char * argc,....)
eg:execl("/bin/ls","ls","-al","/etx/passwd",NULL)
execlp():从PATH环境变量中查找文件并执行。
execlp(const char * file,const char * argc,...);
execve():执行文件
execve(const char * filename,char * const argv[],char * const envp[]);
eg:char * argv[] = {"ls","-al","/etc/passwd",NULL};
char * envp[] = {"PATH = /bin",0};
execv("/bin/ls",argc,argv);
execvp(const chat * file,char * const argv[]);同上
system(const char * string)
eg:system(“ls -al /etc/passwd/etc/shadow”);
三、进程等待
僵尸进程:
为已经结束了的进程,还没有从进程列表中删除。僵尸进程太多会导致进程表里的条目满了,进而导致系统奔溃。
避免僵尸进程:
(1)wait(int * state):等待子进程结束或进程中断。
成功返回子进程的pid,失败返回-1.
(2)waitpid(pid_t pid,int * state,int options):停止目前进程的执行,直到有信号来或者子进程结束。
pid:
pid < -1 :等待进程识别码为pid绝对值的任何子进程。
pid = -1 :等待任何子进程。
pid = 0 :等待进程组识别码和目前进程相同的任何子进程。
pid > 0 :等待进程识别码为pid的子进程。
wait(&state) 相当于 waitpid(-1,&state,0)