获取进程pid、ppid : getpid() getppid()
进程的真实用户id和真实组id : getuid() 、getgid()
进程的有效用户id和有效组id : geteuid()、getegid()
程序和进程的区别:
程序:是代码,是静态的。
进程:程序的一次执行过程,是linux基本调度单位。进程通过进程控制块(PCB)来描述。
进程调度:
内核的
调度器负责在所有的进程间分配CPU执行时间,称为时间片(time slice),它轮流在每个进程分得的时间片用完后从进程那里抢回控制权。
调度周期(时间片周期):就是一轮。一轮有多个进程执行。每一个进程在一个调度周期里分一个时间片。
调度策略:
linux下有三种调度策略:
1.实时调度策略FIFO
2.实时调度策略RR
3.普通调度策略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 <unistd.h>
#include <stdio.h>
int main(){
printf("pid=%d,ppid=%d\n",
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 //把任务拿到前台