获取进程pid、ppid : getpid() getppid()进程的真实用户id和真实组id : getuid() 、getgid()进程的有效用户id和有效组id : geteuid()、getegid()
程序和进程的区别:程序:是代码,是静态的。进程:程序的一次执行过程,是linux基本调度单位。进程通过进程控制块(PCB)来描述。
进程调度: 内核的调度器负责在所有的进程间分配CPU执行时间,称为时间片(time slice),它轮流在每个进程分得的时间片用完后从进程那里抢回控制权。调度周期(时间片周期):就是一轮。一轮有多个进程执行。每一个进程在一个调度周期里分一个时间片。
调度策略:linux下有三种调度策略:1.实时调度策略FIFO2.实时调度策略RR3.普通调度策略OTHER
FIFO、RR对事实性要求高。FIFO:运行优先级高的。高的不运行完,低的就不能运行。RR:优先级相同的轮着来运行。先运行优先级高的,高的运行完了,再运行低的。OTHER:大家一起来。所有优先级的一起来。在一个周期内,优先级高的拿到的时间片多。
公司里面基本所有的服务器都是OTHER。
进程标识pid:每一个进程都有一个唯一的进程id,即pid。每个进程还有自己的父进程,每个进程的ppid就是父进程的id (即parent pid)。所有的进程都有同一个祖先进程:init进程。其pid为1。本来他是0号进程,后来他把自己改成1号了。通过函数getpid()、getppid()得到pid和ppid。
例:获取进程的pid、ppid#include #include int main(){ printf("pid=%d,ppid=%d
",getpid(),getppid()); //直接输出的情况 pid_t pid; pid=getpid(); //通过变量获取的情况 printf("%d",pid); return 0;}
进程的用户id和组id:进程的真实用户id和真实组id:缺省情况下,那个用户运行程序,进程的真实uid就是这个用户的用户id,进程的真实gid就是这个用户的组id。通过函数getuid()和getgid()得到。进程的有效用户id和有效组id: 内核对进程的访问权限检查时,它检查的是进程的有效用户id和有效组id,而不是真实用户id和真实组id。缺省情况下,用户的(有效用户id和有效组id)与(真实用户id和真实组id)是相同的。有效用户id和有效组id可以通过geteuid()和getegid()得到。
s权限:当某一个用户执行二进制可执行文件时,权限会被提升为对应者(s加在哪个组,就是哪个组,一般加在拥有者)的权限。
例子:passwd命令分析[liupc@ubuntu /etc]$>ll passwd-rw-r--r-- 1 root root 2248 May 12 09:03 passwd //通过ll命令可以看/etc/passwd文件:liupc用户是没有权限往/etc/passwd写东西的。但 是我们知道,我可以使用passwd命令来修改自己的密码。因为我下次登入的时候可以 用新的密码登,说明我在liupc用户下使用passwd命令对/etc/passwd文件做了修改。[liupc@ubuntu /etc]$>which passwd //通过which命令查看passwd命令的绝对路径/usr/bin/passwd
[liupc@ubuntu /usr/bin]$>ll passwd //通过ll /usr/bin/passwd可以看到passwd变成了红底,并且具有了s权限。这样普通用户-rwsr-xr-x 1 root root 49644 Apr 20 2015 passwd* 在执行这个可执行文件时,进程就拥有了root的权限,这样就可以修改/etc/passwd了。 程序执行是,进程的有效id就是root。在前面通过stat实现ll命令时,用到了st_mode的 后9位和前4位,中间有3位当时认为是没用的,其实这三位中间有一位就是与x进行操 作,产生s的。例子:s权限的使用步骤1: su liupc touch aaa //使用liupc用户建立文件 chmod 600 aaa //把文件aaa的权限改为600,这个时候其他用户修改不了这个文件 echo "hello" >aaa 步骤2: vim change_aaa.c //编写可执行文件,修改文件aaa gcc change_aaa.c chmod u+s a.out //给可执行文件增加s权限,这样进程就拥有了liupc的有效用户id.这样就可以操作aaa文件了。步骤3: su liming //切换用户 ./a.out aaa //执行
中断、系统调用:服务器编程:只能用系统调用。只有调用了系统调用,才进入内核态。系统启动起来,那一块内存是内核用的。那一块是用户态用的,都订好了。
linux下进程管理: ps -elf:主要看 s pid ppid time(运行时间累计)ps -elf 共有四种状态需要掌握:R:运行(进程就绪和执行在ps-elf下都显示为R)S:睡觉(等待资源)T:暂停(ctrl+Z就是发送暂停的信号,使进程暂停。gdb的原理就是用了暂停的信号。)Z:僵尸(已经结束,但还未被回收)ps -aux:主要看进程的cpu 内存mem占用率.top命令:实时显示cpu使用情况kill:kill -9 不要把他老爹干掉了!nice、renice改变优先级,公司用不到&./a.out & //让进程后台运行bg 2 //让暂停的信号再起来,放到后台fg 1 //把任务拿到前台