当前位置: 首页 > news >正文

unix中的进程标识以及使用场景

一、前言

本文将介绍unix系统中的进程标识以及使用场景。进程标识和用户标识类似,只不过其指代的对象是一个进程。我们常把进程标识称为进程ID,本文将讨论如下内容:
1.什么是进程标识?
2.特殊的进程标识
3.如果获取以及使用进程标识?

二、什么是进程标识?

简单来说,进程标识就是一个用于指定某个进程的非负整数,其具有唯一性。(每个进程只有一个进程标识)
如下图所示:
在这里插入图片描述

(2-1)
上图中的PID指的就是进程ID。
进程标识的唯一性指的是一个进程只有一个进程ID,但如果一个进程终止了,那么其进程ID就会被后续新创建的进程所使用。
值得一提的是,unix系统对于终止进程的ID采用了延迟复用算法,使得新创建的进程不使用刚终止的进程ID。

三、特殊的进程标识

在众多进程中,有一些进程是比较特殊的,它们执行着较为特殊的任务:

3.1 调度进程

进程ID为0的进程是调度进程,也被称为交换进程,该进程是内核的一部分,它不执行任何磁盘上的程序。

3.2 init进程

该进程是应用层执行的第一个进程,其进程ID为1,在内核初始化完成后就会调用该进程,该进程主要完成应用层的初始化工作,通过读取一些系统配置文件将系统设置成既定的运行状态。init进程是不会终止的,它是一个无限循环。
与调度进程不同,init进程是一个普通的用户进程,但它以超级用户特权运行。
另外,init进程还是所有孤儿进程的父进程。

四、如何获取以及使用进程标识?

unix系统提供了很多函数来获取进程相关的标识。(这里说的标识不单只是进程ID,还有用户ID、组ID)
如下所示:

#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

ps:这些函数都没有错误返回。

写一个代码,在程序中创建一个以实际用户id和进程id名命名的文件,参考代码如下:

/*************************************************************************> File Name: pid_uid_test.c> Author: conbiao> Created Time: 2024年09月21日 星期六 09时59分55秒************************************************************************//************************************************************************                             HEADER**********************************************************************/
#include<stdio.h>
#include<fcntl.h>
#include<unistd.h>/************************************************************************                              MACRO**********************************************************************//************************************************************************                          GLOBAL VARIABLE**********************************************************************//************************************************************************                       FUNCTION DESCRIPTION**********************************************************************/
int create_puid_file(void);/***********************************************************************
* FUNCTION NAME: create_puid_file***********************************************************************
*
* Summary:
*   create file use pid and uid
*
* Params:
*   NONE.
*
* Return:
*   O if success.
*  -1 if fail.
*
***********************************************************************/
int create_puid_file(void)
{pid_t pid;uid_t uid;int fl;char file_name[30];printf("%s: start!\n",__func__);//get pid//获取pidpid = getpid();//get uid//获取uiduid = getuid();//Combine UID and PID into a file name.//将uid和pid组合成文件名sprintf(file_name, "%d_%d",pid,uid);printf("%s: filename is %s\n",__func__,file_name);//Create a filefl = creat(file_name, S_IRUSR | S_IWUSR);if(fl == -1)return fl;printf("%s: create file success!\n",__func__);return 0;}/************************************************************************                                MAIN**********************************************************************/
int main(int argc, char *argv[])
{int ret = 0;ret = create_puid_file();return ret;
}

运行结果如下所示:
在这里插入图片描述

(4-1)

参考资料:

《UNIX环境高级编程(第3版) (史蒂文斯 (W.Richard Stevens) 拉戈 (Stephen A.Rago))
(Z-Library)》

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Unity数据持久化4——2进制
  • 【CSS in Depth 2 精译_031】5.3 Grid 网格布局的两种替代语法
  • cpp中的namespace详解
  • 【C++】list详解及模拟实现
  • 软RAID查看状态mdstat的原理
  • 跨越数据孤岛:打造支持多种数据库的Java智能查询引擎及其商业前景
  • C# winforms DataGridView设置数据源自动显示表格
  • JAVA基础:Lock锁
  • imo云办公室 Imo_DownLoadUI.php 任意文件下载漏洞复现
  • Amesim-帮助文件翻译与总结-重要元件之firstorderlag
  • 小琳AI课堂:确保大语言模型安全的八大策略--从数据隐私到用户教育
  • Effective Java 学习笔记 方法签名设计
  • 使用python用递归实现汉诺塔算法
  • 三种springboot启动时加载方式
  • 蓝桥杯【物联网】零基础到国奖之路:十. OLED
  • Angular 2 DI - IoC DI - 1
  • const let
  • download使用浅析
  • Javascript基础之Array数组API
  • PHP 的 SAPI 是个什么东西
  • PHP 使用 Swoole - TaskWorker 实现异步操作 Mysql
  • Shadow DOM 内部构造及如何构建独立组件
  • Spring Cloud中负载均衡器概览
  • 阿里研究院入选中国企业智库系统影响力榜
  • 从零开始的webpack生活-0x009:FilesLoader装载文件
  • 道格拉斯-普克 抽稀算法 附javascript实现
  • 给第三方使用接口的 URL 签名实现
  • 将 Measurements 和 Units 应用到物理学
  • 你不可错过的前端面试题(一)
  • 浅谈web中前端模板引擎的使用
  • 如何优雅地使用 Sublime Text
  • 入手阿里云新服务器的部署NODE
  • 深度学习中的信息论知识详解
  • CMake 入门1/5:基于阿里云 ECS搭建体验环境
  • 格斗健身潮牌24KiCK获近千万Pre-A轮融资,用户留存高达9个月 ...
  • 你学不懂C语言,是因为不懂编写C程序的7个步骤 ...
  • ​HTTP与HTTPS:网络通信的安全卫士
  • #Ubuntu(修改root信息)
  • #我与Java虚拟机的故事#连载07:我放弃了对JVM的进一步学习
  • $(document).ready(function(){}), $().ready(function(){})和$(function(){})三者区别
  • (02)vite环境变量配置
  • (delphi11最新学习资料) Object Pascal 学习笔记---第14章泛型第2节(泛型类的类构造函数)
  • (done) 两个矩阵 “相似” 是什么意思?
  • (Forward) Music Player: From UI Proposal to Code
  • (PySpark)RDD实验实战——求商品销量排行
  • (八十八)VFL语言初步 - 实现布局
  • (附源码)spring boot网络空间安全实验教学示范中心网站 毕业设计 111454
  • (附源码)ssm捐赠救助系统 毕业设计 060945
  • (三)Honghu Cloud云架构一定时调度平台
  • (学习总结16)C++模版2
  • (一)、软硬件全开源智能手表,与手机互联,标配多表盘,功能丰富(ZSWatch-Zephyr)
  • (原創) 如何將struct塞進vector? (C/C++) (STL)
  • .cfg\.dat\.mak(持续补充)
  • .NET MAUI Sqlite程序应用-数据库配置(一)
  • .net对接阿里云CSB服务