进程控制(笔记)

1.获取进程ID

每个进程都有一个唯一的正数进程ID(PID)。

#include <unistd.h>
#include <sys/types.h>

pid_t getpid(void);   //返回进程ID
pid_t getppid(void); //返回它的父进程ID

2.创建和终止进程

父进程通过fork函数创建一个新的运行子进程:

pid_t fork(void);

子进程得到与父进程用户级虚拟地址空间相同的(但是独立的)一份拷贝,包括文本、数据和bss段、堆和用户栈。子进程还获得与父进程任何打开文件描述符相同的拷贝,子进程可以读写父进程中打开的任何文件,如stdout文件(共享文件)。
fork函数“调用一次,返回两次”:一次是在调用父进程中,返回的是子进程的PID;一次是在新创建的子进程中,返回零。通过返回值来辨认程序在哪个进程中执行。
父进程和子进程是并发运行的独立进程。内核能够以任意方式交替执行他们逻辑控制流中的指令。
父进程和子进程拥有相同但是独立的地址空间

进程通过三种方式终止:收到一个信号,该信号的默认行为是终止进程;从主程序返回;调用exit函数。

void exit(int status);

3.回收子进程

当进程由于某种原因终止时,内核并不是立即把它从系统中清除,而是保持在一种终止状态中,知道被他的父进程回收。
父进程回收已终止的子进程时,内核讲子进程的退出状态传递给父进程,然后抛弃已终止的进程,该进程就不存在了。
一个终止了但未被回收的进程称为僵死进程(zombie)。

一个进程可以通过调用waitpid函数来等待他的子进程终止或者暂停:

#include <sys/wait.h>
pid_t waitpid(pid_t pid,int *status,int options);

默认options=0时,waitpid挂起调用进程的执行,直到它的等待集合中的一个子进程终止。
如果pid>0,那么等待集合就是一个单独的子进程,进程ID为pid;pid=-1,那么等待进程就是由父进程所有的子进程组成的。

4.进程休眠

sleep函数让一个进程挂起一段时间。

#include <unistd.h>
unsigned int sleep(unsigned int secs);//返回还要休眠的秒数

pause函数让调用函数休眠,直到该进程收到一个信号为止。

int pause(void);//返回-1

5.加载并运行程序

execve函数在当前进程的上下文中加载并运行一个新程序。

#include <unistd.h>
int execve(char *filename,char *argv[],char *envp[]);

若成功则不返回,若错误则返回-1。

 

 

 

One thought on “进程控制(笔记)”

  1. linux的进程控制感觉更全面啊。当时记得用ACE的时候,我直接写了个getpid,后来被批改为跨平台的了

Leave a Reply

Your email address will not be published. Required fields are marked *