1. 基本知识
在Linux 是一个多用户多任务的操作系统。同时会有不同的用户,向操作系统发出各种命令。
命令通过程序执行。在执行的过程中,就会产生进程。这里我们讲程序和进程之间的关系,我们可以这样理解: 程序是一些以文件的形式存储在操作系统文件系统中,包含可执行代码的静态文件。这些文件在没有被运行的时候,和其他的Word、Excel文档没有本质的区别。
当程序被执行的时候,程序要被读入到内存中并且被执行。在执行的过程中,程序在内存中执行过程中的实例化的体现,就是进程。一个实例可能有很多个进程,每一个进程也可能有子进程。
在进程的执行过程中,操作系统会给进程分配一定的资源(内存,磁盘和设备等),为了区别不同的进程,系统会为不同进程分配唯一的ID进行识别。
系统内部对进程的管理包含以下的状态:
新建—— 进程正在被创建
运行—— 进程正在运行
阻塞—— 进程正在等待某个命令发生
就绪—— 进程正在等待CPU执行命令
完成—— 进程已经结束了,操作系统正在回收资源
2. 通过Shell开列系统进程
下面的Shell执行了3个命令,分别来解读。
(1) 【ps -f】命令列出当前用户的进程。 第一行bash,它的进程ID是28273,这个进程就是我们运行的Shell本身,【ps -f】 命令在这个Shell中执行,所以第二行ps -f的父进程ID就是第一行的进程ID,同时【ps -f】命令也具有自己的独立进程ID。
(2) 【bash】命令在当前Shell中,又创建了一个Shell进程
(3) 【ps -f】命令在这时候列出当前用户的进程时候,这时候可以发现在开始bash进程中,打开了一个bash进程,然后执行【ps -f】命令列出进程的过程。三个进程中,上边的一个进程都是下面一个进程的父进程。
3. Linux C获得当前程序进程及用户信息
/****************************************************** * Program Assignment : 输出进程ID和用户基本信息 * Author: Densin.Tian * Date: 2015/05/02 * Description: *****************************************************/ #include <unistd.h> #include <pwd.h> #include <sys/types.h> #include <stdio.h> #include <stdlib.h> int main(int argc, char **argv){ pid_t my_pid, parent_pid; uid_t my_uid, parent_uid; gid_t my_gid, parent_gid; struct passwd *my_info; my_pid = getpid(); parent_pid = getppid(); my_uid = getuid(); parent_uid = geteuid(); my_gid = getgid(); parent_gid = getegid(); my_info = getpwuid(my_uid); printf("===================================\n"); printf(" Process Information \n"); printf("===================================\n"); printf("Process ID : %ld\n", (long)my_pid); printf("Parent ID : %ld\n", (long)parent_pid); printf("User ID : %ld\n", (long)my_uid); printf("Effective User ID : %ld\n", (long)parent_uid); printf("Group ID : %ld\n", (long)my_gid); printf("Effective Group ID : %ld\n", (long)parent_gid); if(my_info){ printf("===================================\n"); printf(" User Information \n"); printf("===================================\n"); printf("My Login Name : %s\n", my_info->pw_name); printf("My Password : %s\n", my_info->pw_passwd); printf("My User ID : %ld\n", (long)my_info->pw_uid); printf("My Group ID : %ld\n", (long)my_info->pw_gid); printf("My Real Name : %s\n", my_info->pw_gecos); printf("My Home Dir : %s\n", my_info->pw_dir); printf("My Work Shell : %s\n", my_info->pw_shell); } return 0; }