《Linux C编程实战》笔记:进程操作之ID,优先级

news2024/9/26 3:22:57

获得进程ID

getpid函数

这个函数都用了很多次了,看一下定义和例子就行了

#include<sys/types.h>
#include <unistd.h>
pid_t getpid(void);

示例程序1

#include<cstdlib>
#include<malloc.h>
#include<cstring>
#include <cstdio>
#include<ctime>
#include<sys/types.h>
#include<sys/stat.h>
#include<sys/wait.h>
#include<fcntl.h>
#include<unistd.h>
#include<cerrno>
using namespace std;
int main(){
    pid_t pid;
    if((pid=fork())==-1){
        printf("fork error!\n");
        exit(1);
    }
    if(pid==0)
        printf("getpid return %d\n",getpid());//子进程
    exit(0);
}

setuid和setgid

用setuid设置实际用户ID和有效用户ID.setgid用来设置实际组ID和有效组ID

实际用户和有效用户解释见 《Linux C编程实战》笔记:进程操作之创建进程-CSDN博客

 

#include <sys/types.h>
#include <unistd.h>
int setuid(uid_t uid);
int seteuid(uid_t uid);//使用seteuid只会设置有效用户,无论是什么权限
int setgid(gid_t gid);
int setegid(gid_t gid);

设置用户ID的setuid函数遵守以下规则(设置组ID的setgid函数与此类似)。

若进程具有root权限,则函数将实际用户ID、有效用户ID设置为参数uid。
若进程不具有root权限,则setuid只将有效用户ID设置为uid,不改变实际用户ID。
若以上两个条件都不能满足,则函数调用失败,返回-1,并设置errno为 EPERM。

从以上规则可以看出,只有超级用户进程才能更改实际用户ID,所以一个非特权用户进程是不能通过setuid或seteuid得到特权用户权限的。

内核时检查一个进程是否有权限访问某文件时,是使用进程的有效用户ID来检查的。

像su命令,普通用户运行时,su进程的权限是root权限

示例程序2

演示有效用户

#include<cstdlib>
#include<malloc.h>
#include<cstring>
#include <cstdio>
#include<ctime>
#include<sys/types.h>
#include<sys/stat.h>
#include<sys/wait.h>
#include<fcntl.h>
#include<unistd.h>
#include<cerrno>
using namespace std;
int main(){
    int fd;
    printf("uid study:\n");
    printf("Process;s uid=%d,euid=%d\n",getuid(),geteuid());
    //seteuid(0);
    //printf("Process;s uid=%d,euid=%d",getuid(),geteuid());
    if((fd=open("test.c",O_RDWR))==-1){//想要以读写方式打开一个文件
        printf("Open failure,errno is %d:%s \n",errno,strerror(errno));
        exit(1);
    }
    else printf("Open successfully!\n");
    close (fd);
    exit(0);
}

首先,我们以root用户创建一个文件,可以看到其他用户只能读不能写 

我们切换到一个普通用户运行程序,由于程序想要读写文件,是没有权限的

我们把注释取消看看这回能不能读写

首先要在root下位程序文件设置set_uid位,不然程序也是改变不了uid的

  • 最前面的 "4" 代表了setuid位。
  • "7" 代表了所有者的权限,包括读(4) + 写(2) + 执行(1)。
  • "5" 代表了组的权限,包括读(4) + 执行(1)。
  • "5" 代表了其他用户的权限,包括读(4) + 执行(1)。

不过在我的Linux下,即使设置了chmod,依然读不了文件。我也不知道书上是怎么成功的,这个例子我只能以失败告终。

顺便了解

strerror 是一个 C 语言标准库函数,用于将错误码(通常由全局变量 errno 表示)转换为对应的错误消息字符串。函数原型通常定义在 <string.h> 头文件中,其一般形式如下:

#include <string.h> char *strerror(int errnum);

参数 errnum 是一个整数,通常是全局变量 errno 的值,表示发生的错误码。strerror 函数返回一个指向错误消息字符串的指针,该字符串描述了对应错误码的错误信息。

可以这样使用setuid函数:开始时某个程序需要root权限完成一些工作,但后续的工作不需要root权限。可以将该可执行程序文件设置set_uid位,并使得该文件的属主是root。这样普通用户执行这个程序时,进程就具有了root权限,当不再需要root权限时,调用setuid(getuid())恢复进程的实际用户ID和有效用户ID为执行该程序的普通用户的ID.对于一些提供网络服务的程序,这样做是非常有必要的,否则就可能被攻击者利用,使攻击者控制整个系统。

对于设置了set_uid 位的可执行程序也要注意,尤其是对那些属主是root 的更要注意。因为Linux 系统中 root用户拥有最高权力。黑客们往往喜欢寻找设置了set_uid位的可执行程序的漏洞,这样的程序如果存在缓冲区溢出漏洞,并且该程序是一个网络程序,那么黑客可以从远程的地方轻松地利用该漏洞获得运行该漏洞程序的主机的root权限。即使这样的程序不是网络程序,那么也可以使本机上的恶意普通用户提升为root用户。

改变进程优先级

nice函数

nice系统调用用来改变调用进程的优先级。

#include <unistd.h>
int nice (int increment);

在介绍nice系统调用的用法前,需要先了解两个重要的函数:getpriority和setpriority,它们声明如下:

#include <sys/resource.h>
int getpriority(int which, int who);
int setpriority(int which, int who,int prio);

getpriority函数:该函数返回一组进程的优先级。参数 which和 who组合确定返回哪一组进程的优先级。which的可能取值以及 who的意义如下。
PRIO_PROCESS:一个特定的进程,此时who的取值为进程ID。
PRIO_PGRP:一个进程组的所有进程,此时who的取值为进程组ID。
PRIO_USER:一个用户拥有的所有进程,此时参数who取值为实际用户ID。

getpriority函数如果调用成功返回指定进程的优先级,如果出错将返回-1,并设置errno的值。errno可能的取值如下。
 ESRCH: which和 who的组合与现存的所有进程均不匹配。

 EINVAL: which是个无效的值。

setpriority函数:该函数用来设置指定进程的优先级。进程指定的方法与getpriority 函数相同。如果调用成功,函数返回指定进程的优先级,出错则返回-1,并设置相应errno。除了产生与getpriority相同的两个错误外,还有可能产生以下错误。
EPERM:要设置优先级的进程与当前进程不属于同一个用户,并且当前进程没有CAP_SYS_NICE特许。
EACCES:该调用可能降低进程的优先级并且进程没有CAP_SYS_NICE特许。

nice是它们的组合形式,nice系统调用等于

int nice(int increment){
    int oldpro=getpriority(PRIO_PROCESS,getpid());
    return setpriority(PRIO_PROCESS,getpid(),oldpro+increment);
}

就相当于 原本的优先级加上increment参数,返回新的优先级 

示例程序3

#include<cstdlib>
#include<malloc.h>
#include<cstring>
#include <cstdio>
#include<ctime>
#include<sys/types.h>
#include<sys/stat.h>
#include<sys/wait.h>
#include<sys/resource.h>
#include<fcntl.h>
#include<unistd.h>
#include<cerrno>
using namespace std;
int main(){
    pid_t pid;
    int stat_val=0;
    int oldpri,newpri;
    printf("nice study\n");
    pid=fork();
    switch (pid)
    {
    case 0:
        printf("Child is running,CurPid is %d,ParentPid is %d\n",getpid(),getppid());
        oldpri=getpriority(PRIO_PROCESS,getpid());
        printf("Old priority=%d\n",oldpri);
        newpri=nice(2);//优先级提升2
        printf("New priority=%d\n",newpri);
        exit(0);
    case -1:
        perror("Process creation failed\n");
        break;
    default:
        printf("Parent is running,ChildPid is %d,ParentPid is %d\n",pid,getpid());
        break;
    }
    wait(&stat_val);
    exit(0);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1323979.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

中国社科院与新加坡新跃社科联合培养工商管理博士

全球经济正在经历由科技进步与创新、政治和人口的剧烈变化所带来的巨大不确定性与挑战。企业的领导者和管理者需要发展出战略性思维和全球洞察力以便面对越来越大的经济波动。中国社科院与新加坡新跃社科联合培养工商管理博士项目的训练能够让学生在一个企业和组织的改变和发展…

快速给SOLIDWORKS工程图添加水印

水印常见于电子文档或纸质上的文字或图案&#xff0c;日常生活中&#xff0c;一些特殊的水印只能在特定的条件下才能看到。水印可以作为一个品牌的象征&#xff0c;有的软件生成文档就会有水印&#xff0c;可以作为宣传&#xff0c;让更多的人熟知。 作品水印&#xff0c;就是…

app测试必掌握的核心测试:UI、功能测试!

一、UI测试 UI即User Interface (用户界面)的简称。UI 设计则是指对软件的人机交互、操作逻辑、界面美观的整体设计。好的UI设计不仅是让软件变得有个性有品味,还要让软件的操作变得舒适、简单、自由、充分体现软件的定位和特点。手机APP从启动界面开始, 到运行过程,直至退出,…

为什么要编写测试用例,测试用例写给谁看?

“为什么要编写测试用例&#xff0c;测试用例写给谁看”&#xff0c;这个问题看似简单&#xff0c;但却涵盖了一系列复杂的考虑因素&#xff0c;并不太好回答。 为了向各位学测试的同学们解释清楚“为什么编写测试用例是至关重要的”&#xff0c;我将通过以下5个方面进行展开&…

【工具使用-ADB】小米手机如何使用adb传输文件

一&#xff0c;简介 本文主要介绍&#xff0c;如何使用小米手机&#xff0c;打开adb设置进行文件的传输。供参考 二&#xff0c;操作步骤 2.1 进入开发者模式 “设置”->“我的设备”->“全部参数信息” 连续多次点击“MIUI 版本”&#xff0c;直到提示“您已处于开…

英码科技受邀参加2023计算产业生态大会,分享智慧轨道交通创新解决方案

12月13-14日&#xff0c;“凝心聚力&#xff0c;共赢计算新时代”——2023计算产业生态大会在北京香格里拉饭店成功举办。英码科技受邀参加行业数字化分论坛活动&#xff0c;市场总监李甘来先生现场发表了题为《AI哨兵&#xff0c;为铁路安全运营站好第一道岗》的精彩主题演讲&…

计算机网络 运输层上 | 运输层概述 UDP协议 端口 套接字

文章目录 1 运输层概述1.1 运输层存在的意义1.2 运输层协议概述1.3 主要端口号 2 运输层主要协议 UDP2.1 UDP的特点2.2 UDP首部格式2.3 UDP工作流 1 运输层概述 1.1 运输层存在的意义 之前我们讲网络层的时候&#xff0c;已经可以将信息从一个主机传递到另一个主机了。 那么…

轻推API无代码集成:创新电商CRM与客服系统

无代码API集成的力量&#xff1a;电商与CRM无缝对接 随着电子商务的快速发展&#xff0c;电商平台与客户关系管理&#xff08;CRM&#xff09;系统的高效对接成为商家竞争力的关键。无代码API集成平台如轻推&#xff0c;提供了简单易用的解决方案&#xff0c;使得电商企业能够…

机器学习中的一些经典理论定理

PAC学习理论 当使用机器学习方法来解决某个特定问题时&#xff0c;通常靠经验或者多次试验来选择合适的模型、训练样本数量以及学习算法收敛的速度等。但是经验判断或多次试验往往成本比较高&#xff0c;也不太可靠&#xff0c;因此希望有一套理论能够分析问题难度、计算模型能…

Axure中如何使用交互样式交互事件交互动作情形

&#x1f3ac; 艳艳耶✌️&#xff1a;个人主页 &#x1f525; 个人专栏 &#xff1a;《产品经理如何画泳道图&流程图》 ⛺️ 越努力 &#xff0c;越幸运 目录 一、Axure中交互样式 1、什么是交互样式&#xff1f; 2、交互样式的作用&#xff1f; 3、Axure中如何…

计算机组件操作系统BIOS的相关知识思维导图

&#x1f3ac; 艳艳耶✌️&#xff1a;个人主页 &#x1f525; 个人专栏 &#xff1a;《产品经理如何画泳道图&流程图》 ⛺️ 越努力 &#xff0c;越幸运 目录 一、运维实施工程师需要具备的知识 1、运维工程师、实施工程师是啥&#xff1f; 2、运维工程师、实施工…

《每天一分钟学习C语言·三》

1、 scanf的返回值由后面的参数决定scanf(“%d%d”,& a, &b); 如果a和b都被成功读入&#xff0c;那么scanf的返回值就是2如果只有a被成功读入&#xff0c;返回值为1如果a和b都未被成功读入&#xff0c;返回值为0 如果遇到错误或遇到end of file&#xff0c;返回值为EOF…

论文报告公式序号右对齐技巧

最近在写报告&#xff0c;感觉这个方法很不错&#xff0c;所以记录一下。 1.添加一个1行3列的表格&#xff0c;将公式序号放在中间表格与右边表格中&#xff0c;公式居中&#xff0c;序号右对齐。 2.将边框去掉&#xff0c;选择无边框。 3.得出结果 结束&#xff01;&#xff…

新型智慧视频监控系统:基于TSINGSEE青犀边缘计算AI视频识别技术的应用

边缘计算AI智能识别技术在视频监控领域的应用有很多。这项技术结合了边缘计算和人工智能技术&#xff0c;通过在摄像头或网关设备上运行AI算法&#xff0c;可以在现场实时处理和分析视频数据&#xff0c;从而实现智能识别和分析。目前来说&#xff0c;边缘计算AI视频智能技术可…

Ansible(一)

Ansible: 远程操作主机功能&#xff1a; 自动化运维&#xff08;playbook剧本YAML&#xff09; 是基于Python开发的配置管理应用部署攻具&#xff0c;在自动化运维当中&#xff0c;现在是异军突起 Ansible能批量配置&#xff0c;部署&#xff0c;管理上千台主机&#xff0c…

【简洁易懂】为什么绝对收敛的级数一定条件收敛?【考研向】

针对某高热帖子真的想说&#xff0c;什么时候讨论知识的戾气不那么重了&#xff0c;什么时候能把知识深入浅出的讲明白了&#xff0c;什么时候我们才能有希望吧。 图源&#xff1a;https://www.youtube.com/watch?v3ShPTvJUFrU

9ACL访问控制列表

为什么要有访问控制&#xff08;Access Control List&#xff09;&#xff1f; 因为我可能在局域网中提供了一些服务&#xff0c;我只希望合法的用户可以访问&#xff0c;其他非授权用户不能访问。 原理比较简单&#xff0c;通过对数据包里的信息做过滤&#xff0c;实现访问控…

为什么GRU和LSTM能够缓解梯度消失或梯度爆炸问题?

1、什么是梯度消失&#xff08;gradient vanishing&#xff09;&#xff1f; 参数更新过小&#xff0c;在每次更新时几乎不会移动&#xff0c;导致模型无法学习。 2、什么是梯度爆炸&#xff08;gradient exploding&#xff09;&#xff1f; 参数更新过小大&#xff0c;破坏了…

事务的两阶段提交

参考了小林coding 为什么两阶段提交 事务提交后&#xff0c;redo log 和 binlog 都要持久化到磁盘&#xff0c;但是这两个是独立的逻辑&#xff0c;可能出现半成功的状态&#xff0c;这样就造成两份日志之间的逻辑不一致。 举个例子&#xff0c;假设 id 1 这行数据的字段 n…