自学内容网 自学内容网

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
    //获取pid
    pid = getpid();

    //get uid
    //获取uid
    uid = 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 file
    fl = 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)》


原文地址:https://blog.csdn.net/weixin_48344581/article/details/142412458

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!