Linux 中的 renice 命令详解及C/C++代码实现

Linux 中的 renice 命令详解及C/C++代码实现Linux 中的 nice 命令有助于执行具有修改的调度优先级的程序 进程 它启动具有用户定义的调度优先级的进程 如果我们给一个进程更高的优先级 那么内核会为这个进程分配更多的 CPU 时间 而 renice 命令允许您更改和修改已运行进程的调度优先级 什么是进程简而言之 进程是 Linux 用来承担运行程序角色的命名约定 进程是规则的集合 任何特定程序通过这些规则使用分配的处理器时间 内存和 I O 资源 Linux 系统上运行的每个进程都有自己的进程 ID PID 通过它可以对其进行监视和管

Linux 中的 nice 命令有助于执行具有修改的调度优先级的程序/进程。 它启动具有用户定义的调度优先级的进程。

如果我们给一个进程更高的优先级,那么内核会为这个进程分配更多的 CPU 时间。 而 renice 命令允许您更改和修改已运行进程的调度优先级。

什么是进程

简而言之,进程是 Linux 用来承担运行程序角色的命名约定。 进程是规则的集合,任何特定程序通过这些规则使用分配的处理器时间、内存和 I/O 资源。 Linux 系统上运行的每个进程都有自己的进程 ID (PID),通过它可以对其进行监视和管理。

Linux内核旨在收集有关每个进程的各种信息。 这些包括但不限于:

现在我们对流程有了一些了解,我们可以继续创建一些流程。 为此,只需打开终端并在后台执行 yes 命令并将其输出重定向到 /dev/null:

在这里插入图片描述
从上面我们可以阅读到以下信息:

进程的生命周期

Linux 进程管理的基本原则在创建新进程时包含两个不同的操作。 该操作是进程通过 fork() 调用复制自身的地方,从而创建一个具有唯一 PID 的新进程。 fork 操作最常见的是执行新程序的 exec() 操作。 在引导期间创建的第一个进程是 init,它始终分配 PID 1。所有其他进程都被视为 init 进程的子进程。

通常情况下,在子进程允许死亡之前,此事件需要由父进程通过发送退出值来确认。 成功终止发送父进程值 0。如果由于某种原因子进程超过父进程 init 将接受此进程作为孤立进程。

renice命令的使用

我们可以利用 renice 命令在进程运行时更改 niceness。 要查看语法,我们将传递 –h 选项:

在这里插入图片描述

renice 命令可以应用于进程、进程组或用户(目标)。 特权用户可以更改其他用户进程的优先级。 对于普通用户,优先级必须介于 0 和环境变量 PRIO_MAX(通常为 20)之间,数字越大表示友好度越高。

较高的 niceness 值意味着进程将以较低的优先级运行。 特权用户可以设置一个负优先级,低至 PRIO_MIN(通常为 -20),以加快进程。 请参阅 nice 命令以在初始运行时设置进程的调度优先级。

在这里插入图片描述
renice 命令示例:

在这里插入图片描述要更改它的值,我们可以使用 renice 命令并提供 PID 和 nice 值。 让我们将 nice 值更改为 15:

在这里插入图片描述

要遵循的规则是,非超级用户只能为任何进程增加 nice 值(给予较低的优先级)。 如果现在尝试将 nice 值从 15 更改为 10,则会出现以下错误:

renice: failed to set priority for 2329 (process ID): Permission denied

renice 命令还使 root 用户能够更改任何用户进程的 nice 值。 这是通过 -u 开关完成的。 以下 linux 命令将所有用户进程的优先级更改为 -19。

在这里插入图片描述

Linux renice命令C/C++实现

int main(int argc, char *argv[]) { 
    if (argc < 2) usage(); if (strcmp(*argv, "-n") == 0) { 
    incr = 1; argc--, argv++; if (argc < 2) usage(); } if (getnum("priority", *argv, &prio)) return (1); argc--, argv++; for (; argc > 0; argc--, argv++) { 
    if (strcmp(*argv, "-g") == 0) { 
    which = PRIO_PGRP; continue; } if (strcmp(*argv, "-u") == 0) { 
    which = PRIO_USER; continue; } if (strcmp(*argv, "-p") == 0) { 
    which = PRIO_PROCESS; continue; } if (which == PRIO_USER) { 
    if ((pwd = getpwnam(*argv)) != NULL) who = pwd->pw_uid; else if (getnum("uid", *argv, &who)) { 
    errs++; continue; } else if (who < 0) { 
    warnx("%s: bad value", *argv); errs++; continue; } } ... } 

运行结果:

在这里插入图片描述
在这里插入图片描述

总结

本篇讲解如何使用 renice Linux 命令更改进程的优先级值。更多了解请参考man手册。

欢迎关注微信公众号【程序猿编码】,需要renice命令完整源码的添加本人微信号(c)

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/224681.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月17日 上午11:23
下一篇 2026年3月17日 上午11:23


相关推荐

  • 屏蔽(禁止)鼠标右键代码「建议收藏」

    屏蔽(禁止)鼠标右键代码「建议收藏」屏蔽鼠标右键禁止鼠标右键onselectstart="returnfalse"禁止选择,ondragstart="returnfalse"禁止拖放,o

    2022年7月3日
    23
  • dpdk 性能_第二系列什么意思

    dpdk 性能_第二系列什么意思首先,DPDK和内核网络协议栈不是对等的概念。DPDK只是单纯的从驱动拿数据,然后组织成数据块给人用,跑在用户态。功能相当于linux的设备无关接口层,处于socket之下,驱动之上。只不过linux协议栈的这部分在核心态。你说的包处理器,很多时候是不用linux内核协议栈的,而是用专用包处理程序,类似于DPDK加上层应用处理。通常会有些硬件加速器,包处理效率更高些。缺点是一旦用不上某些功能

    2026年1月30日
    3
  • 文心一言API接口怎么申请_文心一言API接口申请步骤

    文心一言API接口怎么申请_文心一言API接口申请步骤

    2026年3月12日
    3
  • linux强制删除只读文件夹,强制删除文件夹linux的方法是什么

    linux强制删除只读文件夹,强制删除文件夹linux的方法是什么灰烬里等你丶回答数:14479|被采纳数:22016-12-1714:18:36linux下删除文件的命令是rm;以下分两种介绍删除方法:对于目录文件的删除:#rf-rffilename对于非目录文件的删除:#rffilename之所以对于目录文件的删除加上了强制参数是因为在linux对目录文件的删除是递归式的;rm的参数如下所示:OPTIONSRemove(unlink)t…

    2022年6月13日
    39
  • Kubernetes搭建spinnaker服务

    Kubernetes搭建spinnaker服务背景 2017 2018 年左右的吧 不记得看什么了看到了 spinnaker 但是当时真的安装不起来 各种被墙裂 2020 年底学习了泽阳大佬的 spinnaker 实践课程 通过 Halyard 方式搭建了 spinnaker 的集群 并与 jenkinsgitla 完成了集成 2021 年初稍微玩了一下 就去整别的事情去了 没有能应用于线上环境 下半年了 jenkinsk8s 这些的流程现在基本都是清晰了 想把 cd 从 jenkins 中剥离出来教给 spinnaker 了 就重新温习一下 spinnak

    2025年12月2日
    6
  • Linux系统的镜像文件iso下载地址[通俗易懂]

    Linux系统的镜像文件iso下载地址[通俗易懂] 打开如下地址http://archive.kernel.org/centos-vault/6.1/isos/x86_64/然后选择  CentOS-6.1-x86_64-bin-DVD1.iso即可下载。

    2022年5月2日
    50

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号