linux系统编程--进程管理
1.空闲进程:当没有其他进程运行,内核所运行的进程。它的pid是0 2.在系统启动后,内核运行的第一个进程是init进程,它的pid是1 3.init进程启动后,内核交出控制权,然后init进程会初始化系统,启动各种服务和启动登录进程 4.缺省情况下,内核将进程ID最大值限制在32768。进程ID线性递增,不会重用以前的。除非到达最大值,所以在相当长一段时间内可能保证同一个进程ID的唯一。 5.获得进程ID:getpid() 获得父进程的ID:getppid() 6.运行新进程 execl():将path路劲的映像载入内存,替换当前进程的映像。 fork():创建一个和当前进程映像一样的进程 常用的用法是:先fork一个子进程,然后在子进程调用execl载入新的二进制可执行文件的映像 7.终止进程 exit() 第二种:收到信号SIGTERM SIGKILL exit做了3件事情:第一,调用atexit注册得函数;第二,清空所有已经打开的I/O流;第三,删除由tmpfile()创建的所有临时文件。 8.注册在进程结束时候要调用的函数 atexit() ---函数调用顺序和注册顺序相反,后进先出LIF 9.SIGCHILD:当一个进程的子进程终止时,内核会向其父进程发送SIGCHILD信号。缺省情况下,父进程会忽略次信号量,可以通过signal或者sigaction的调用来处理信号 10.僵尸进程:如果一个进程终止了,但是它的父进程还在等待获得它的状态 设计僵尸进程的目的:如果子进程终止,就没有给父进程留下更多信息,比如子进程的返回值。所以在子进程在父进程之前结束,内核把子进程设置成一个特殊的状态,处于这种状态的进程叫做僵尸进程。僵尸进程等待父进程来查询自己的信息,只要父进程获取了子进程的信息,内核就会让子进程消失,否则一直保持僵尸状态。 wait()函数:父进程调用它来了解终止的子进程的信息, waitpid():等待指定pid的子进程 waitid():提供了更多的子进程信息 具体可以查看 看书记录--僵尸进程和孤儿进程的概念 11.system() 会调用fork产生子进程,子进程调用bin/sh来执行shell命令 他是一个集合了fork,exec,waitpid等概念的函数 12.用户id:/etc/passwd 组id:/etc/group 与进程相关的用户id有四个:实际用户id,有效用户id,保存设置的用户id,文件系统用户id 实际用户id(RUID):用于标识一个系统中用户是谁,一般是在登录之后,就被唯一确定的,就是登陆的用户的uid 有效用户id(EUID):用于系统决定用户对系统资源的权限。也就是说当用户做任何一个操作时,最终看它有没有权限,都是在判断有效用户ID是否有权限。在正常情况下,一个用户登录之后(我们假设是A用户),A用户的有效用户ID和实际用户ID是相同的,但是如果A用户在某些场景中 想要执行一些特权操作,而上面我们说到用户的任何操作,LINUX内核都是通过检验有效用户ID来判断当前执行这个操作的用户是否具有权限,显然是特权操作,A用户没有权限,所以A用户就只能通过一定的手段来修改当前的有效用户ID使其具有执行特权操作的权限。这里说明了下面为什么我们需要修改有效用户ID,就是想再某一时刻能够执行一些特权操作。 保存设置的用户id(SUID):是有效用户ID副本,既然有效用户ID是副本,那么它的作用肯定是为了以后恢复有效用户ID用的。 13. 改变RUID和SUID:setuid() setgid() 改变EUID:seteuid() setegid() 非root用户应该使用seteuid()来设置EUID。想临时改变EUID最好使用seteuid() 14. 获取用户ID和组ID:getuid() getgid() geteuid() getegid() 文件的用户组和权限:http://www.cnblogs.com/123-/p/4189072.html 15.创建会话 发送信号给进程组或者进程 创建会话:setsid() 获取会话:getsid() 16.改变某个进程的进程组id:setpgid() getpgid() 17.守护进程: 运行在后台,不与任何控制终端相关联 两个要求:必须是init进程的子进程 不与任何控制终端关联 创建步骤:1.先调用fork,2.然后父进程调用exit,3.调用setsid(),使得守护进程有一个新的进程组合新的会话。4.用chdir()将当前工作目录改成根目录。5.关闭所有的文件描述符。6.打开0,1,2号文件描述符(标志输入,输出和错误),把它们重定向到/dev/null