linux 进程管理

Posted qianbo_insist

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux 进程管理相关的知识,希望对你有一定的参考价值。

其他文章

高级文件I/O

在linux里面,进程是仅仅次于文件的基本抽象概念,进程除了汇编代码,还有数据,资源,状态和虚拟计算机组成。

进程和线程

    unix 系统提供了两个系统调用来创建进程,fork 和 exec。每个进程里面有一个或者多个线程,线程包含虚拟存储器,包括栈、进程状态既然创建进程使用fork 等函数,那么谁来创建第一个进程呢,进程状态如寄存器,以及指令指针。在进程内,所有线程共享相同的内存地址空间。

pid

进程由一个唯一的整数值标识,叫做pid,unix和linux系统的第一个进程就是内核,其pid为0. 而内核运行的第一个进程是init, pid为1.

进程分配

那么linux系统最多启动多少个进程?默认状态下为32768,是有符号16位整数,当然,可以修改/proc/sys/kernel/pid_max 来设置更大的值。
每个进程都是属于某个用户和用户组,用来实现访问控制,子进程继承了父进程的用户和组,每个进程属于某个进程组,进程组和作业又是紧密联系的。

进程ID和父进程ID

#include <sys/types.h>
#include <unistd.h>
pid_t getpid(void);

而函数 getppid 是返回父进程ID,也就是parent id。

fork 系统调用

pid_t fork(void)
pid_t pid ;
pid = fork();
if(pid>0)
{
 //  notice ,here is parent process
// 实际上,这里是父进程运行的地方
}
else if(!pid)
{
  //成功的子进程运行的地方
}
else if(pid ==-1)
{
 // 失败
}

开销

&创建子进程后,也就是调用fork()后,内核需要复制所有的内部数据结构,复制进程的页表,把父进程的地址空间按页复制到子进程的地址空间中,但是,按页复制是非常耗时,所以,linux系统按照惰性算法,写时复制(copy-on-write,COW)的方式,而不是对父进程空间进行立即整理复制,子进程准备修改某个和父进程共享的页时,产生缺页中断,这时候再进程该页的复制,在一定的程度上,开销会减少,这种方式预见了一些不会修改资源的场景。

终止进程

#include <stdlib.h>
void exit(int status);
#include <unistd.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/wait.h>
int main(void)
{
   int status;
   pid_t pid;
   if(!fork())
      return 1;
   pid = wait(&status);
   if(pid ==  -1)
   {
      perror("wait");
   }   
   printf("pid = %d",pid);
   if(WIFEXITED(status))
      printf("exit status %d\\n",WEXISTATUS(status));
   if(WIFSIGNALED(status))
   {
   	   printf("killed by signal = %d%s", WTERMSIG(status),WCOREDUMP(status) ? "dumped core" :"");
   }
   if(WIFSTOPPED(status))
      printf("stopped by signal %d\\n",WSTOPSIG(status)); 
   if(WIFCONTINUED(status))
      printf("continue\\n");   
   return 0;
}

gcc test.c -o wait
$ ./wait
pid = 7878
exit status 1

等待特定信号

pid_t waitpid(pid_t pid, int *status, int options);

守护进程

守护进程运行在后台,不与控制终端关联, 守护进程在系统启动时运行,以root用户或者特殊用户运行,并处理任务

1 调用fork,创建新进程,该进程称为守护进程

2 在守护进程的父进程中调用exit()

3 调用setsid()

4 调用chdir,当工作目录修改为根目录

5 关闭所有的文件描述符

6 文件描述符 标准输入 输出 标准错误 重定向到/dev/null

#include <unistd.h>
int daemon(int nochdir,int noclose)

c 库函数提供的daemon来自动完成守护进程的工作,简化任务,其中:
nochdir 如果时非0,则不会将工作目录改成根目录
noclose 如果为非0,则不会关闭文件描述符。

下一章将会讲述高级进程管理

以上是关于linux 进程管理的主要内容,如果未能解决你的问题,请参考以下文章

linux c 退出进程的代码

Linux进程管理

Linux系统管理10——进程和计划任务管理

Linux中的进程管理

Linux进程和计划任务管理

Linux进程和任务管理