全部博文(8)
分类:
2012-02-01 11:08:58
原文地址:Linux应用程序开发学习(三)进程控制 作者:ruixiang
三,进程控制
1,进程是动态的,程序是静态的。进程有三态,阻塞,就绪,执行,详见操作系统资料。进程创建运行时首先处于就绪态,通过操作系统的调度占用CPU时转为执行态。执行态时间片用完就会转为就绪态。运行态时假如访问某一设备而设备正忙时就会转为阻塞态,一旦设备空闲就会就绪,再有调度时就会转为执行态。
2,进程用进程控制块PCB来描述,它包含了进程的描述信息,控制信息和资源信息,它是进程的一个静态描述。进程有自己的PID,其父进程ID为PPID,启动这个进程的用户的ID为UID。
3,进程互斥是指有若干进程都要使用某一共享资源时,任何时刻最多允许一个进程使用,其它要使用该资源的进程必须等待,直到占用该资源者释放了该资源为止。
4,操作系统中将一次只允许一个进程访问的资源称为临界资源。进程中访问临界资源的那段程序代码称为临界区。为实现对临界资源的互斥访问,应保证各进程互斥的进入各自的临界区。
5,一组并发进程按一定的顺序执行的过程称为进程的同步。具有同步关系的一组并发进程称为合作进程,合作进程间互相发送的信号称为消息或事件。
6,进程调度就是按一定算法,从一组待运行的进程中选出一个来占有CPU来运行。调度方式有抢占式和非抢占式。调度算法一般有先来先服务,短进程优先,高优先级优先,时间片轮转。
7,死锁就是多个进程因竞争资源而形成一种僵局,若无外力作用,这些进程都将永远不能再向前推进。
8,getpid函数,pid_t getpid(void)
获取本进程ID。
getppid函数,pid_t getppid(void)
获取父进程ID。
9,fork函数,pid_t fork(void)
创建之进程,它被调用一次,却返回两次,可能有三种不同的返回值:
1)在父进程中,fork返回新创建的子进程的PID;
2)在子进程中,fork返回0;
3)如果出现错误,fork返回一个负值。
10,在fork函数调用之前,只有一个进程在执行,但在这个函数调用之后,就变成两个进程在执行了,这两个进程共享下面的代码段。父子进程的区别在于PID不同。子进程的数据空间、堆栈空间都会从父进程得到一个拷贝,而不是共享。在子进程中对fork调用代码之下的某一变量的操作并不会影响到父进程中该变量的值。一个好的例子见国嵌的视频。
11,vfork函数,pid_t vfork(void)
创建子进程。与fork的区别如下:
1)fork是子进程拷贝父进程的数据段,而vfork是子进程与父进程共享数据段;
2)fork的父子进程的执行次序不确定,而vfork是子进程先运行,父进程后运行。
12,exec函数族
exec用被执行的程序替换调用它的程序。它取代原调用进程的数据代码堆栈段。它与fork的区别如下:
1)fork创建一个新的进程,产生一个新的PID;
2)exec启动一个新程序,替换原有的进程,因此进程的PID不会改变,个人认为一般在fork后的子进程中使用。
13,execl函数,int execl(const char *path, const char *arg1, ...)
参数1为被执行的程序名,完整路径,参数2-n为被执行程序所需的命令行参数,含程序名,以空指针NULL结束。
14,execlp函数,int execlp(const char *file, const char *arg1, ...)
参数1为被执行程序名,不含路径,将从path环境变量中查找该程序,参数2同execl。
15,execv函数,int execv(const char *path, char * const argv[])
参数1是被执行程序名,完整路径,参数2是被执行程序所需的命令行参数组数。
16,system函数,int system(const char *string)
调用fork产生子进程,由子进程来调用/bin/sh -c string来执行参数string所代表的命令。个人认为重要且好用,双向应用程序中用的多。
17,wait函数,pid_t wait(int *status)
阻塞该进程,直到其某个子进程退出或者该进程接到了一个指定的信号。如果该进程没有子进程或者它的子进程已经结束,则wait函数会立即返回。参数status若为空则代表任意状态结束的子进程,若不为空则代表指定状态结束的子进程。
18,waitpid函数,pid_t waitpid(pid_t pid, int *status, int options)
waitpid是wait的超集,这有若干选项,如可提供非阻塞的wait功能,也能支持作业控制。参数pid如果大于0则表示只是等待这个pid的子进程退出,其它子进程退出wqit无视依然在等,如果pid为-1则与wait一样。参数status同wait,参数options如果为0则同wait,如为WNOHANG则表示如果由pid指定的子进程不立即可用,waitpid不阻塞,此时返回0。
19,exit/_exit函数, void exit(int status)/void _exit(int status)
此两个函数调用时,进程会无条件的停止剩下的操作,清除PCB,并终止本进程的运行。exit对_exit进行了封装,exit多了之前的的检查文件打开情况,把文件缓冲区内容写回文件等清理IO缓冲的工作。若想保证数据的完整性就一定要使用exit函数。参数status传递进程结束的状态,0表示正常结束,其它表示出现了错误,在实际使用时可以用wait系统调用接收子进程的返回值,从而针对不同的情况做不同的处理。