Linux C, 取得进程信息和用户信息

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; 
}



郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。