进程属性

1:进程号(PID)
进程号是系统维护的唯一一个标识一个进程的正整数,用户层无法对其进行修改。
Linux下操作系统的第一个进程为init进程,其他进程在此基础上增长,
可以使用ps aux 查看当前系统的所有进程的基本属性。
例:
在这里插入图片描述
我们通过getpid()函数可以获得当前进程的pid
该函数包含在#include<unistd.h>函数中
pid_t实际上就是int,用来记录进程号的。只不过在这里为了增加程序可读性进程了自定义
我们模拟实现获取pid可以自己写个程序
源码:

#include<stdio.h>
#include<unistd.h>

int main(int argc,char *argv[])
{
  printf("the current program's pid is%d",getpid());
  return 0;
}

2:父进程号(PPID)
任何进程(除了init进程)都是由另一个进程创建的,改进程被称为进程的子进程,父进程无法在用户层面进行修改。父进程的pid号就是子进程的ppid号。用户可以通过getppid()函数来获取当前进程的父进程号。

#include<stdio.h>
#include<unistd.h>

int main(int argc,char *argv[])
{
  printf("the current program's ppid is%d",getppid());
  return 0;
}

在这里插入图片描述
3:进程组号(PGID)
每个用户都有自己的用户号(UID)和用户组号(GUID)。,进程拥有自己进程号(PID)和进程组号(PGID)。
**getpgid()函数用来获取指定进程的进程组号,**函数有个参数
_pid_t getpgid(_pid_t _pid),
getpgrp()也可以用来获取当前进程的进程组号。但组长进程可以先退出,只要在某个进程组中有一个进程存在,这个进程就存在,其组长进程是否终止无关。
将某个进程加到某个进程组:函数 setpgid()
int setpgid(pid_t pid,pid_t pgid);
第一个参数为想要修改的PGID进程的PID,第二个参数为新的进程的PID号。
一个进程只能为自己或者子进程设置进程组号PGID。
4:会话(SID)
会话是一个或者多个进程组的集合。系统调用函数getsid()来获取某个进程的会话号SID。
以上就是进程的基本属性,接下来我们来看进程的用户属性。

1:进程真实用户号(RUID)
创建该进程的用户的UID(执行次此程序的用户)为此进程的真实用户号。可用个getuid()函数获取当前进程的真实用户号。
2:进程有效用户号(EUID)。
主要用于权限检查,多数情况下EUID和UID相同。如果可执行文件的setuid位有效,该文件拥有者之外的用户运行此程序的时候,EUID和UID不相同。当某可执行文件设置了setgid位后,任何用户运行此程序时,有效用户组EUID为改文件拥有者。
我们来看一段代码

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>

int main(int argc,char* argv[])
{
  int uid,euid,suid;
  getresuid(&uid,&euid,&suid);
  printf("uid = %d,euid = %d,suid = %d\n",uid,euid,suid);
  return 0;
}

在不同用户(root 和普通用户)下执行UID是不一样的。

3:进程用户组号(GID)
可以通过getgid()来获取当前进程的用户组号。
4:有效进程组号(EGID)
一般情况下,EGID和GID相同,但是当某个可执行文件设置了setgid()位,任何用户在运行此程序时,有效用户组号EGID为该文件的拥有者所在的组。可用getgid()函数来获取当前进程的有效用户组号。

猜你喜欢

转载自blog.csdn.net/flf1234567898/article/details/106734822
今日推荐