Linux 进程操作(二)

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



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值