Linux C编程---进程一、进程 1、什么是进程 当运行任何一个UNIX命令时,shell至少会建立一个进程来运行这个命令,所以可以把任何在UNIX系统中运行的程序叫做进程;但是进程并不是程序,进程是动态的,而程序是静态的,并且多个进程可以并发的调用同一个程序。 系统中每一个进程都包含一个task_struct数据结构,所有指向这些数据结构的指针组成一个进程向量数组,系统缺省的进程向量数据大小是512,表示系统中可同时容纳512个进程。进程的task_struct数据结构包括了进程的状态、调度信息、进程标识符等信息。 由于UNIX系统是一个多进程的操作系统,所以每一个进程都是独立的,都有自己的权限及任务,所以当某一进程失败时并不会导致别的进程失败。系统通过进程标识符来区分不同的进程,进程标识符是一个非负正数,他在任何时刻都是唯一的,当某个进程结束时,他的进程标识符可以分配给另外一个新进程。系统将标识符0分配给调度进程,标识符1分配给初始化进程。 进程在运行期间,会用到很多资源,包括最宝贵的CPU资源,当某一个进程占用CPU资源时,别的进程必须等待正在运行的进程空闲CPU后才能运行,由于存在很多进程在等待,所以内核通过调度算法来决定将CPU分配给哪个进程。 系统在刚刚启动时,运行于内核方式,这时候只有一个初始化进程在运行,他首先做系统的初始化,然后执行初始化程序(一般是/sbin/init)。初始化进程是系统的第一个进程,以后所有的进程都是初始化进程的子进程。 2、进程的创建 进程由fock函数创建,在unistd.h库中定义如下:
fock函数调用一次却返回两次;在父进程中返回子进程的ID,在进程中返回0,这是因为父进程可能存在很多过子进程,所以必须通过这个返回的子进程ID来跟踪子进程,而子进程只有一个父进程,他的ID可以通过getppid取得。先面程序创建一个子进程:
调用fock创建子进程后,父进程中所有打开的描述字在子进程中是共享的,这个特性在网络服务器中广泛使用,例如父进程通过socket函数返回一个套接字,然后调用fock函数创建字进程,这个子进程就可以直接对这个已经存在的套接字进行操作。fock的另一个典型应用是创建一个子进程调用exec函数来代替自己去执行新的程序。 3、进程的执行 UNIX系统执行以文件形式存储在磁盘上的可执行程序的唯一方法是用一个现有的进程去调用六个exec函数之一,六个exec函数定义如下:
在以上六个exec函数中,第一个参数如果为pathname,则说明被执行程序是由路径名指定,如果为filename,则说明是由文件名指定;第二个参数如果为数组,说明被执行程序的参数是由一个数组来索引(数组必须含有一个空指针来表示结束),否则需要将参数一一列出;execle()及execve()的envp指针数组表示这两个函数显示指定一个环境表(这个数组必须以一个空指针结束),而另外四个函数则用外部变量environ的当前值来创建一个环境表传递给新程序。 exec函数把新程序装入调用进程的内存空间,来改变调用进程的执行代码。当exec函数执行成功,调用进程将被覆盖,相当于产生一个新进程,但是新进程的进程表识符号和调用进程的进程表识符相同,所以exec并没象fock函数一样创建一个新进程,而是用新进程取代了调用进程。下面是一个fork()结合exec()的程序:
二、守护进程 1、什么是守护进程 守护进程是脱离于终端并且在后台运行的进程。守护进程脱离于终端是为了避免进程在执行过程中的信息不在任何终端上显示并且进程也不会被任何终端所产生的终端信息所打断。 2、守护进程的启动 守护进程一般可以通过以下方式启动: A:在系统启动时由启动脚本启动,这些启动脚本通常放在/etc/rc.d目录下 B:利用inetd超级服务器启动,大部分网络服务都是这样启动的,如ftp、telnet等 C:另外,由cron定时启动以及在终端用nohup启动的进程也是守护进程上一篇:PHP中的常量和变量 下一篇:如何阅读源代码--工具篇 更多相关文章
|
推荐文章
精彩文章
|