1. 进程标识
(1) 进程标识说明
每个进程都有一个非负整型的唯一进程ID。因为进程ID标识符总是唯一的,常将其用作其他标识符的一部分以保证其唯一性。
在Linux中,进程ID 0是调度进程,常常被称为交换进程。该进程并不执行任何磁盘上的程序—它是内核的一部分,因此也被称为系统进程。进程ID 1通常是init进程,在自举过程结束时由内核调用。
init通常读与系统有关的初始化文件(/etc/rc*文件),并将系统引导到一个状态 (例如多用户 ),init进程决不会终止,它是一个普通的用户进程 (与交换进程不同,它不是内核中的系统进程 ),但是它以超级用户特权态运行,init进程是所有孤儿进程的父进程。
在 Linux 中最主要的进程标识有进程号(PID,Process Idenity Number)和它的父进程号(PPID,parent process ID), 其中 PID 唯一地标识一个进程,PID 和 PPID 都是非零的正整数。
(2) 进程标识相关函数原型
头文件 | #include <sys/types.h> #include <unistd.h> | |
函数说明 | 函数原型 | 返回值 |
pid_t getpid(void ) | 进程ID | |
pid_t getppid(void ) | 父进程ID | |
uid_t getuid(void ) | 实际用户ID | |
uid_t geteuid(void ) | 有效用户ID | |
gid_t getgid(void ) | 实际组ID | |
gid_t getegid(void ) | 有效组ID | |
struct passwd * getpwuid(uid_t uid) | 用来逐一搜索参数uid 指定的用户识别码,找到时便将该用户的信息以passwd结构返回 |
(3) 进程标识函数使用实例
pid.c源代码如下:
#include <unistd.h>
#include <pwd.h>
#include <sys/types.h>
#include <stdio.h>
int main(int argc,char **argv)
{
pid_t my_pid,parent_pid;
uid_t my_uid,my_euid;
gid_t my_gid,my_egid;
struct passwd *my_info;
my_pid=getpid();
parent_pid=getppid();
my_uid=getuid();
my_euid=geteuid();
my_gid=getgid();
my_egid=getegid();
my_info=getpwuid(my_uid);
printf("Process ID%ld/n",my_pid);
printf("Parent ID%ld/n",parent_pid);
printf("User ID%ld/n",my_uid);
printf("Effective User ID%ld/n",my_euid);
printf("Group ID%ld/n",my_gid);
printf("Effective Group ID%ld/n",my_egid) ;
if(my_info)
{
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",my_info->pw_uid);
printf("My Group ID %ld/n",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);
}
}
编译 gcc pid.c –o pid。
执行 ./pid,执行结果如下:
Process ID6492
Parent ID5707
User ID1008
Effective User ID1008
Group ID1003
Effective Group ID1003
My Login Name zjkf
My Password x
My User ID 1008
My Group ID 1003
My Real Name zjkf,,,,
My Home Dir /home/zjkf
My Work Shell/bin/bash
摘录自《深入浅出Linux工具与编程》