Linux下进程的创建

时间:2021-09-06 17:33:50

  这篇文章主要是讲解到Linux进程的控制,包括程序和进程、守护进程、守护进程的出错处理。

1、程序和进程

  程序(program)是存放在磁盘文件中的可执行文件,程序的执行实例被称为进程(process)。

init进程

  每个linux进程都一定有一个唯一的数字标识符,称为进程ID(process ID),进程ID总是一非负整数,进程ID为1通常是init进程,在自举过程结束时由内核调用。init进程绝不会终止,它是一个普通的用户进程(与交换进程不同,它不是内核中的系统进程),但是它以超级用户特权运行。

  Linux系统是一个多进程的系统,进程之间具有并行性、互不干扰的特点。linux中进程包含3个段,分别为“代码段”、“数据段”和“堆栈段”:

    Linux下进程的创建Linux下进程的创建Linux下进程的创建

    “数据段”:存放全局变量、常数以及动态数据分配的空间(malloc函数取得的空间);

    “代码段”:存放程序代码;

    “堆栈段”:存放子程序的返回地址、子程序的参数以及程序的局部变量。

获取进程标识:

#include <sys/types.h>
#include <unistd.h>
pid_t getpid(void);   返回:调用进程的进程I D
pid_t getppid(void);   返回:调用进程的父进程I D
uid_t getuid(void);   返回:调用进程的实际用户I D
uid_t geteuid(void);   返回:调用进程的有效用户I D
gid_t getgid(void);   返回:调用进程的实际组I D
gid_t getegid(void);   返回:调用进程的有效组I D
 
进程创建:
  创建一个进程很简单,先来认识一下fork函数

#include <sys/types.h>

#include <unistd.h>

  pid_t fork(void);

  返回:子进程中为0,父进程中为子进程I D,出错为-1

  由fork创建的新进程被称为子进程( child process)。该函数被调用一次,但返回两次,两次返回的区别是子进程的返回值是0,而父进程的返回值则是子进程的进程ID。 一般来说,在f o r k之后是父进程先执行还是子进程先执行是不确定的。这取决于内核所使用的调度算法。

  使用fork函数得到的子进程是父进程的处继承了整个进程的地址空间,包括:进程上下文、进程堆栈、内存信息、打开的文件描述符、信号控制设置、进程优先级、进程组号、当前工作目录、根目录、资源限制、控制终端等。

 

2.守护进程

  守护进程( daemon)是生存期长的一种进程,它们常常在系统引导装入时起动,在系统关闭时终止,因为它们没有控制终端,所以说它们是在后台运行的。

  守护进程有一下特征:

  所有守护进程都以超级用户(用户I D为0)的优先权运行;

  没有一个守护进程具有控制终端—终端名称设置为问号(?)、终端前台进程组I D设置为-1。缺少控制终端可能是精灵进程调用了s e t s i d的结果;

  除u p d a t e以外的所有精灵进程都是进程组的首进程,对话期的首进程,而且是这些进程组和对话期中的唯一进程。u p d a t e是它所在进程组和对话期(中的唯一进程,但是该进程组的首进程(可能也是该对话期的首进程)已经终止;

  所有这些守护进程的父进程都是i n i t进程。

 

3.守护进程的出错处理

  由于守护进程完全脱离了控制终端,因此,不能像其他程序一样通过输出错误信息到控制台的方式来通知程序员。通常的办法是使用syslog服务,将出错信息输入到“/var/log/message”系统日志文件中去,Syslog是linux中的系统日志管理服务通过守护进程syslog来维护,这里不多阐述。