linux中每个进程都有唯一的进程标识,Linux C编程--进程介绍6--进程的各种标识

本文将介绍进程的:

1.进程的用户标识号

2.进程标识号

进程的用户ID

Linux/Unix进程涉及到三类用户ID:

1、实际用户ID(real user id,RUID):为该进程的的创建者的用户ID,也可以说是进程的执行者。该ID仅root用户可以修改;

2、有效用户ID(effective user id,EUID):该ID用于标识用户进程执行操作的权限。普通用户可以将EUID设置为RUID或者SUID,而普通用户可以将EUID设置为任意的合法的UID。

3、保存设置用户ID(saved set-user-id,SUID):该ID主要用于进程用于切换其有效用户ID(EUID)时使用。对于没有设置set-uid-bit的可执行程序(文件)而言,其对应进程的保存设置用户ID(SUID)为其实际用户ID;而对于设置了set-uid-bit 的程序(文件)而言,其对应的保存设置用户ID(SUID)为该可执行文件的文件拥有者用户ID。另外SUID在其值发生改变时会记录新的SUID值。

一个可执行的二进制文件,如果其set-use-id bit 被设置,则运行该程序时,对应进程的有效用户ID(EUID)为该文件的文件所有者用户ID。这个在文件访问目录中有描述,可参考。

在APUE2中,对于进程涉及的三类用户ID有详细说明,结合该内容整理几点:

1、如果进程具有超级用户特权,则通过setuid(uid)函数可将实际用户ID,有效用户ID,以及保存设置用户ID设置为uid。此时不关心uid的值是否与RUID,EUID,SUID相等(超级用户就是牛叉,想设定什么uid就设定什么用户uid)。特权用户执行setuid时候,会将RUID,EUID,SUID全部设置为uid,如果uid对应用户非特权的话,则执行此类操作后无法重新回到超级用户了(已经装换为普通的权力了)。

2、没有超级用户特权的普通用户,通过调用setuid(uid)时,仅当uid=RUID,或者SUID时候,才可以将其有效用户ID(EUID)设置为uid,此时不影响RUID,SUID的值。

3、如果用户通过setuid(uid)设置进程的UID时候,uid不满足上述所说的规则,则setuid函数执行失败,返回EPERM错误。

通过上述描述可以看出:

1、只有超级用户可以更改进程的实际用户ID(RUID),其他用户无法修改其RUID。

2、仅当程序文件设置了set-user-id bit时,EUID 才等于程序文件的所有者用户ID,没有设置,则EUID为用户的RUID。任何时候可以通过setuid将进程的有效用户ID(EUID)设置为实际用户ID(RUID)或者保存是指用户ID(SUID),但不能将EUID设置为任意的uid(即,随即值)。

3、保存设置用户ID(SUID)是从用户的有效用户ID(EUID)复制而来。

下表为改变三个用户ID的 不同方法(APUE2)

-----------------------------------------------------------------------

|                   exec                    |    setuid(uid)

ID  ------------------------------------------------------------------

| set-user-id bit off | set-user-id bit on  | superuser|normal user

------------------------------------------------------------------------

RUID |     不变            |     不变            |设置为uid  |不变

EUID |     不变            | 设置为程序文件RUID   |设置为uid  |设置为uid

SUID |   从EUID复制        | 从EUID复制           |设置为uid  |不变

------------------------------------------------------------------------

另外,通过seteuid可将设置进程的有效用户ID(EUID),且如下:

1、一个非特权用户通过该进程有效用户ID(EUID)设置为其实际用户ID(RIIOD),或者保存设置用户ID(SUID);

2、对于一个特权用户,可以将有效用户ID(EUID)设置为uid(uid为任意值,且仅影响其EUID,不改变其他ID:RUID,SUID)

三、相关API

1、int setuid(uid_t u i d) ;     2、int setgid(gid_t g i d) ;

------设置用户的RUID/RGID(特权用户会涉及EUID/EGID,SUID/SGID).

3、int setreuid(uid_t ru i d, uid_t e u i d) ;     4、int setregid(gid_t rg i d, gid_t e g i d) ;

------交换进程实际用户(组)与有效用户(组)ID.

5、int seteuid(uid_t u i d) ;     6、int setegid(gid_t g i d) ;

-------设置进程有效用户(组)ID.

7、uid_t getuid(void);     8、uid_t geteuid(void);

----------获取用户实际用户ID(RUID)/有效用户ID(EUID).

9、gid_t getgid(void);    10、gid_t getegid(void);

----------获取用户实际用户组ID(RUID)/有效用户组ID(EGID).

下面给出一个例子,说明上述系统函数的用法

#include

#include

#include

int main(int argc, char *argv[])

{

int i,ret;

if(argc!=2)

{

printf("Usage %s num\n",argv[0]);

exit(1);

}

i=atoi(argv[1]);

printf("Before uid = %d ,euid = %d \n",getuid(),geteuid());

ret=setuid(i);

printf("After uid = %d ,euid =%d\n",getuid(),geteuid());

printf("ret=%d\n",ret);

}

进程ID

在Linux 中主要的进程标识符有进程号(PID),和它的父进程(PPID)(parents process ID)。PID和PPID都是非零的正整数,在linux中获得当前的进程PID和PPID的系统调用函数为getpid和getppid 。

getpid系统调用说明:

所需头文件

#include

函数功能:

取得当前进程的进程号

函数原型:

int getpid();

函数传入值:

函数返回

成功返回当前进程的进程号,失败将错误包含在perror中

备注:

getppid系统调用说明:

所需头文件

#include

函数功能:

取得当前进程的父进程号

函数原型:

int getppid();

函数传入值:

函数返回

成功返回当前进程的父进程号,失败将错误包含在perror中

备注:

下面给出一个实现的例子

说明:由于系统中的进程标识号是唯一的,所以可以利用进程标识号命名临时文件,下面给出实现

#include

#include

char file[20],string[8];

char *tmp="./tmp.";

int main()

{

char *s;

int fd;

s=(char *)malloc(100);

sprintf(s,"%d",getpid());

printf("pid is %s\n",s);

strcpy(file,tmp);

strcat(file,s);

if((fd=creat(file,0644))==-1)

{

fprintf(stderr,"file: %s create failed.\n",file);

exit(1);

}

write(fd,"TMP file\n",9);

close(fd);

exit(0);

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值