Linux进程控制

进程概论

进程标识及用户id、组id

1
2
3
4
5
6
7
8
9
10
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
int main()
{
printf("pid:%d ppid:%d euid:%d egid:%d\n",getpid(),getppid(),geteuid(),getegid());
return 0;
}
//进程的pid和ppid(父进程)可以分别通过函数getpid()和getppid()获得
//geteuid(),getegid() 获取有效用户和有效组id

Linux高级权限控制

1
2
3
chmod u+s a.out #设置使文件在执行阶段具有文件所有者的权限. 典型的文件是 /usr/bin/passwd. 如果一般用户执行该文件, 则在执行过程中, 该文件可以获得root权
chmod g+s /home/xxxx #该权限只对目录有效.目录被设置该位后,任何用户在此目录下创建的文件都具有和该目录所属的组相同的组.
chmod o+t /temp #(粘滞位) 该位可以理解为防删除位.一个文件是否可以被某用户删除, 主要取决于该文件所属的组是否对该用户具有写权限. 如果没有写权限, 则这个目录下的所有文件都不能被删除, 同时也不能添加新的文件. 如果希望用户能够添加文件,但同时不能删除文件,则可以对文件使用sticky bit位. 设置该位后, 就算用户对目录具有写权限,也不能删除该文件。

进程状态

  • 执行态
  • 就绪态
  • 等待态

进程结构

-数据段:全局变量、常数以及动态数据分配的数据空间。数据段分为普通数据段(包括可读可写/只读数据段,存放静态初始化的全局变量或常亮)、BSS数据段(存放未初始化的全部变量)以及堆(存放动态分配的数据) -代码段:存放的是程序代码的数据 -堆栈段:存放的是子程序的返回地址,子程序的参数以及程序的局部变量 ### Linux下的进程管理 | 命令 | 含义 | | ------- | -------------------------------------------- | | ps | 查看系统中的进程 | | top | 动态显示系统中的进程 | | nice | 按用户指定的优先级运行 | | renice | 改变正在运行进程的优先级 | | kill | 向进程发送信号(包括后台进程) | | crontab | 用于安装、删除或者列出驱动cron后台进程的任务 | | bg | 将刮起的进程放到后台运行 |

TIP:

  • ps -aux //查看内存、cpu占用率
进程状态 说明
R 正在执行中
S 静止状态
T 暂停执行
Z 不存在但暂时无法消除(僵尸)

#进程的创建 ## system函数

1
2
3
#include<stdlib.h>
int system(const char *string);
//system函数通过调用shell程序/bin/sh -c来执行string所指定的命令,该函数内部是通过调用execve("/bin/sh",...)函数实现的。
## fork函数
1
2
3
#include<unistd.h>
pid_t fork(void);
//使用fork函数得到的子进程是父进程的一个复制品,它从父进程继承了进程的地址空间,包括进程上下文、进程堆栈,内存信息,打开文件的描述符、信号控制设定,进程优先级、进程组号、当前工作目录、根目录、资源限制、控制终端,而子进程所独有的只有他的进程号、资源使用和计时器等。通过这种复制方式创建出子进程后,原有进程和子进程都从函数fork返回,各自继续往下运行,但是远进程的fork返回值与子进程的fork返回值不同,原进程中,fork返回子进程的pid,而在子进程中,fork返回0,如果fork返回负值,表示创建子进程失败。
## exec函数族
1
2
int execl(const char *path,const char *arg,...)
//exec函数是用exec的第一个参数指定的程序覆盖现有的进程空间(后面的代码不再执行)
# 进程控制与终止 ## 进程的控制
1
2
3
4
5
#include<sys/types.h>
#include<sys/wait.h>
pid_t wait(int *status);
pid_t waitpid(pid_t pid,int *status,int options);
//options用于改变waitpid的行为,最常用的WNOHANG表示无论子进程是否退出都将立即返回,不会将调用者的执行挂起
WIFEXITED(status) 如果子进程正常结束,返回非0值,

WEXITSTATUS //如果WIFEXITED非0,它返回子进程的退出码

1
2
3
4
5
#include<stdlib.h>
#include<unistd.h>
sched_yield() //放弃cpu
void _exit(int status);//不会刷新IO缓冲(系统调用)
void exit(int status);

进程的终止

  • main函数的自然返回
  • 调用exit函数
  • 调用_exit函数
  • 调用abort函数
  • 调用能导致进程周知的信号,Ctrl+s Ctrl+c

守护进程(Daemon)

启动方式

  • 创建子进程,父进程退出
  • 在子进程中创建新对话(setuid)
  • 重设文件掩码umask(0)
  • 改变当前目录为根目录
  • 关闭不需要的文件描述符