1. 获得进程ID
系统调用 getpid()------> 用来获取当前进程ID
e.
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
int main()
{
pid_t pid;
if((pid = fork()) == -1){ //first return the child pid
printf("fork error!\n");
exit(1);
}
if(pid== 0)//second return 0 ,-->child
{
printf("get pid: %d\n",getpid());
}
exit(0);//normol end
}
程序运行结果:
lau@lau-Lenovo-Flex-2-14:/LINUX/进程控制$ ./getpid
get pid: 10916
lau@lau-Lenovo-Flex-2-14:/LINUX/进程控制$ ./getpid
get pid: 10918
lau@lau-Lenovo-Flex-2-14:/LINUX/进程控制$ ./getpid
get pid: 10920
lau@lau-Lenovo-Flex-2-14:LINUX/进程控制$ ./getpid
get pid: 10922
2. setuid和setgid
setuid( uid ):设置实际用户id和有效用户id;
setgid( gid ): 设置实际组id 和 有效组 id
设置用户ID应满足的条件:(两者类似)
(1) 该进程有root权限:函数将实际用户id和有效用户id 设置 为 uid
(2)该进程无root权限,但uid等于 实际用户id:只将有效用户id设置为 uid
(3)不满足以上条件,返回错误信息
- 只有超级用户进程才能更改实际用户id,也就说明,一个非特权用户是不能通过该系统调用得到特权用户权限的;
- su命令可以使一个普通用户变成特权用户:su是一个set_uid 程序,执行一个设置setuid位的程序时内核将进程有效用户id设置为文件属主id。内核检查一个进程是否有访问一个文件的权限时,使用的是进程的有效id来进行检查的。su程序的文件属主是root,普通用户运行su命令时,su进程的权限是root权限。
该程序:解释内核如何检查一个进程是否有访问某文件的权限
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <error.h>
extern int errno;
int main()
{
int fd;
printf("uid study: \n");
printf("Process's id : %d,euid = %d\n",getuid(),geteuid());//euid 有效用户ID
//error
if((fd = open("getpid.c",O_RDWR)) == -1)
{
printf("open failure.........\n");
exit(1);
}
else{
printf("open successfully\n");
}
close(fd);
exit(0);
}
3.改变进程优先级
系统调用 nice:用来改变调用进程的优先级
getpriority(): 返回一组进程的优先级
setpriority(): 设置指定进程的优先级
nice系统调用是他们的一种组合方式
nice等价于:
int nice(int increment)
{
int oldpro = getpriority(PRIO_PROCESS,getpid());
return setpriority(PRIO_PROCESS,getpid(),oldpro+increment);
}
nice 使用
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/resource.h>
#include <sys/wait.h>
int main()
{
pid_t pid;
int stat_val=0;
int oldpri,newpri;
printf("nice study\n");
pid = fork();
switch(pid)
{
case 0:
printf("child process is running ,Curpid is %d,ParentPid is %d\n",pid,getppid());
oldpri = getpriority(PRIO_PROCESS,0);
printf("Old priority = %d\n",oldpri);
newpri = nice(2);
printf("new priority = %d\n",newpri);
exit(0);
default:
break;
}
wait(&stat_val);//等待子进程结束,否则会使子进程变成僵尸进程
exit(0);
}
运行结果
nice study
child process is running ,Curpid is 0,ParentPid is 17100
Old priority = 0
new priority = 2