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的进程
- Linux进程学习笔记(一)
- Linux进程学习笔记一
- Linux进程学习笔记一
- linux进程学习笔记一--进程控制
- LINUX内核进程调度学习笔记(一)
- Linux多进程编程学习笔记一
- Linux进程通信----学习笔记(一)
- Linux多进程编程学习笔记一
- Linux多进程编程学习笔记一
- 进程学习笔记(一)
- linux 进程学习(一)
- Linux进程学习一
- Linux进程学习一
- Linux 进程学习(一)
- Linux 进程学习(一)
- Linux进程学习笔记
- Linux进程学习笔记
- Linux 进程学习笔记
- 深入理解HTTP Session
- java引用数据类型之数组
- ipq8064 openwrt 上KGDB工作不正常
- 图片擦除-美女效果
- NOJ 题目1642 简单的图论问题?(BFS)
- Linux进程学习笔记(一)
- Qt中设置widget背景颜色/图片的注意事项(使用样式表 setStyleSheet())
- 菜花这样做,就着它吃光三碗饭
- 初学Volley
- POJ 3253(Huffman树求最小权值)
- 简述java构造函数
- JAVA观感器
- NOJ 题目1645 聊天止于呵呵(模拟)
- The Java™ Tutorials — Generics :Generic Types 泛型