Linux进程学习笔记(一)

来源:互联网 发布:单片机 控制 四轴 编辑:程序博客网 时间:2024/06/05 19:09

进程是一个程序一次执行的过程,是一个运行着的程序,包含了进程的动态创建、调度和消亡的过程,是Linux的基本调度单位。


进程标识

OS会为每个进程分配一个唯一的整型ID,做为进程的标识号(pid)。
进程除了自身的ID外,还有父进程ID(ppid),所有进程的祖先进程是同一个进程,它叫做init进程,ID为1,init进程是内核自启后的一个启动的进程。
init进程负责引导系统、启动守护(后台)进程并且运行必要的程序。


获取当前进程id
getpid()子进程
getppid()父进程

#include <stdio.h>#include <stdlib.h>#include <sys/types.h>#include <unistd.h>int main(){    pid_t pid  = getpid();    pid_t ppid  = getppid();    printf("pid = %d\n, ppid = %d\n", pid, ppid);    return 0;}

进程的用户ID与组ID(进程的运行身份)

进程在运行过程中,必须具有一类似于用户的身份,以便进行进程的权限控制,例如,假设当前登录用户为gotter,他运行了ls程序,则ls在运行过程中就具有gotter的身份,该ls进程的用户ID和组ID分别为gotter和gotter所属的组。
这类型的ID叫做进程的真实用户ID和真实组ID。真实用户ID和真实组ID可以通过函数getuid()getgid()获得。

与真实ID对应,进程还具有有效用户ID和有效组ID的属性,内核对进程的访问权限检查时,它检查的是进程的有效用户ID和有效组ID,而不是真实用户ID和真实组ID。缺省情况下,用户的(有效用户ID和有效组ID)与(真实用户ID和真实组ID)是相同的。

有效用户id和有效组id通过函数geteuid()和getegid()获得:

#include <stdio.h>#include <stdlib.h>#include <sys/types.h>#inclue <unistd.h>int main(){    uid_t uid = getuid();    gid_t gid = getgid();    uid_t euid = geteuid();    gid_t egid = getegid();    printf("uid = %d\ngid = %d\neuid = %d\negid = %d\n", uid, gid, euid, egid);    return 0;}

执行:

gcc getuid.c
./a.out
uid = 1000gid = 1000euid = 1000egid = 1000

现在将a.out的所有者可执行属性改为s

chmod u+s a.out
ls -l-rwsrwxr-x 1 yu yu 7488 Jan 24 18:53 a.out

设置了s的属性,设置了该属性以后,用户运行a.out时,a.out进程的有效用户身份将不再是运行a.out的用户,而是a.out文件的所有者


s权限最常见的例子是
/usr/bin/passwd程序,它的权限位为

-rwsr-xr-x 1 root root 49644 Apr 20  2015 /usr/bin/passwd

实现普通用户权限提升功能

1、首先root用户touch创建a.txt 内容“hello”
2、1.c程序代码

#include <stdio.h>#include <unistd.h>#include <sys/types.h>#include <stdlib.h>#include <errno.h>#include <fctnl.h>int main(){    printf("uid = %d    gid = %d\n", getuid(), getgid());    printf("eudi= %d    egid = %d\n", geteuid(), getegid());    FILE* fp = fopen("a.txt", "a");//注意这里是以追加形式打开,说明a.txt要具有可写权限    if(fp == NULL)    {            perror("fopen error");            exit(-1);    }    fputs("world", fp);    fclose(fp);    return 0;}

3、用root用户编译gcc –o 1 1.c生成可执行程序1
此时1类似于/usr/bin/passwd文件

4、普通用户yu执行1(即shell->./1)

uid = 1000  gid = 1000eudi = 1000  egid = 1000fopen error: Permission denied

说明普通用户没有可写权限,如果直接切换到普通用户执行./1会报错。
5、用root身份将1的权限修改为-rwsr-xr-x
(操作命令:chmod u+s 1,此时跟/usr/bin/passwd的权限一样)
此时再切换到普通用户yu 执行./1

uid = 1000  gid = 1000eudi = 0  egid = 1000

写入数据成功。
普通用户yu权限得到提升。


进程的状态

ps 查看活动进程
ps -aux 查看所有进程
ps -aux | grep 'aa'查找指定(aa)进程
ps –ef可以显示父子进程关系
top显示前20条进程,动态的改变

进程状态:执行 就绪 等待状态


ps –aux

%cpu(cpu使用量)

%mem(内存使用量)

stat状态{S睡眠 T暂停 R运行 Z僵尸}

vi a.c &(&表示后台运行),一个死循环,按ctrl+z可以把进程暂停,再执行

[bg作业ID]可以将该进程带入后台。

利用jobs可以查看后台任务,fg 1把后台任务带到前台,这里的1表示作业ID

kill -9 进程号表示向某个进程发送9号信号,从而杀掉某个进程

利用pkill a可以杀死进程名为a的进程

0 0
原创粉丝点击