進程屬性

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()函數來獲取當前進程的有效用戶組號。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章