linux 进程管理
Posted qianbo_insist
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux 进程管理相关的知识,希望对你有一定的参考价值。
其他文章
在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 进程管理的主要内容,如果未能解决你的问题,请参考以下文章