Linux进程控制
进程概论
进程标识及用户id、组id
1 |
|
Linux高级权限控制
1 | chmod u+s a.out #设置使文件在执行阶段具有文件所有者的权限. 典型的文件是 /usr/bin/passwd. 如果一般用户执行该文件, 则在执行过程中, 该文件可以获得root权 |
进程状态
- 执行态
- 就绪态
- 等待态
进程结构
-数据段:全局变量、常数以及动态数据分配的数据空间。数据段分为普通数据段(包括可读可写/只读数据段,存放静态初始化的全局变量或常亮)、BSS数据段(存放未初始化的全部变量)以及堆(存放动态分配的数据) -代码段:存放的是程序代码的数据 -堆栈段:存放的是子程序的返回地址,子程序的参数以及程序的局部变量 ### Linux下的进程管理 | 命令 | 含义 | | ------- | -------------------------------------------- | | ps | 查看系统中的进程 | | top | 动态显示系统中的进程 | | nice | 按用户指定的优先级运行 | | renice | 改变正在运行进程的优先级 | | kill | 向进程发送信号(包括后台进程) | | crontab | 用于安装、删除或者列出驱动cron后台进程的任务 | | bg | 将刮起的进程放到后台运行 |
TIP:
- ps -aux //查看内存、cpu占用率
进程状态 | 说明 |
---|---|
R | 正在执行中 |
S | 静止状态 |
T | 暂停执行 |
Z | 不存在但暂时无法消除(僵尸) |
#进程的创建 ## system函数 1
2
3
int system(const char *string);
//system函数通过调用shell程序/bin/sh -c来执行string所指定的命令,该函数内部是通过调用execve("/bin/sh",...)函数实现的。1
2
3
pid_t fork(void);
//使用fork函数得到的子进程是父进程的一个复制品,它从父进程继承了进程的地址空间,包括进程上下文、进程堆栈,内存信息,打开文件的描述符、信号控制设定,进程优先级、进程组号、当前工作目录、根目录、资源限制、控制终端,而子进程所独有的只有他的进程号、资源使用和计时器等。通过这种复制方式创建出子进程后,原有进程和子进程都从函数fork返回,各自继续往下运行,但是远进程的fork返回值与子进程的fork返回值不同,原进程中,fork返回子进程的pid,而在子进程中,fork返回0,如果fork返回负值,表示创建子进程失败。1
2int execl(const char *path,const char *arg,...)
//exec函数是用exec的第一个参数指定的程序覆盖现有的进程空间(后面的代码不再执行)1
2
3
4
5
pid_t wait(int *status);
pid_t waitpid(pid_t pid,int *status,int options);
//options用于改变waitpid的行为,最常用的WNOHANG表示无论子进程是否退出都将立即返回,不会将调用者的执行挂起
WEXITSTATUS //如果WIFEXITED非0,它返回子进程的退出码
1 |
|
进程的终止
- main函数的自然返回
- 调用exit函数
- 调用_exit函数
- 调用abort函数
- 调用能导致进程周知的信号,Ctrl+s Ctrl+c
守护进程(Daemon)
启动方式
- 创建子进程,父进程退出
- 在子进程中创建新对话(setuid)
- 重设文件掩码umask(0)
- 改变当前目录为根目录
- 关闭不需要的文件描述符