Linux nice 命令C/C++实现 (改变执行程序的优先级)

Linux 命令行的强大之处在于甚至可以使用命令行工具轻松调整进程的调度优先级。而nice 命令运行具有修改的调度优先级的命令。

显示 Linux 进程

top 是一个简单的命令,它提供有关每个进程使用系统资源的信息。 这包括与 CPU 调度相关的知识。 通过在终端中输入 top 我们得到:
在这里插入图片描述
相邻的两列表示每个进程的优先级相关值。 PR 列表示进程的实际内核给定优先级,而 NI 列提供每个进程的 Nice Value。

Niceness 值的范围从 -20(对过程最有利)到 19(对过程最不利)。

如果用户想进一步了解它,可以查看man top。

在这里插入图片描述可以使用带有 -l 选项的 ps 命令

在这里插入图片描述
niceness 值由 NI 列标题表示。 PRI 列标题表示进程的实际优先级。

Linux nice 命令

在任何给定的时间点,一个系统中运行着数百个进程,其中大部分是由 Linux 操作系统创建的,还有一些是由用户创建的。 每个正在运行的进程都有一个分配给它的优先级,该优先级决定了系统执行它的速度。 较高优先级的进程通常比低优先级的进程更早执行。

nice 命令在 Linux 进程启动之前配置它的优先级。 一旦启动,您将无法使用 nice 命令更改优先级。

在这里插入图片描述
在 Linux 系统中,共有 140 个优先级,其范围从 -20 到 +19,其中 +19 表示最低优先级,-20 表示最高优先级。 正如您所注意到的,这是nice 值和priority 值之间的反比例关系。

例子:
在这里插入图片描述不带任何参数的 nice 命令,显示新进程的默认友好度,这通常为零。

nice命令设置进程的优先级

nice 命令可用于以用户指定的 nice 值启动进程。 这基本上改变了内核分配的实际优先级。

nice -n < VALUE > < COMMAND >

在这里插入图片描述

在这里插入图片描述
nice命令C/C++代码实现

int main(int argc, char **argv)
{
	long niceness = DEFNICE;
	int ch;
	char *ep;

	if (argc >= 2 && argv[1][0] == '-' && (argv[1][1] == '-' ||
	    isdigit(argv[1][1])) && strcmp(argv[1], "--") != 0)
		if (asprintf(&argv[1], "-n%s", argv[1] + 1) < 0)
			printf("asprintf\n");

	while ((ch = getopt(argc, argv, "n:")) != -1) 
	{
		switch (ch) 
		{
			case 'n':
				errno = 0;
				niceness = strtol(optarg, &ep, 10);
				if (ep == optarg || *ep != '\0' || errno ||
					niceness < INT_MIN || niceness > INT_MAX)
					printf("%s: invalid nice value\n", optarg);
				break;
			default:
				usage();
		}
	}
	argc -= optind;
	argv += optind;

	if (argc == 0)
		usage();

	errno = 0;
	niceness += getpriority(PRIO_PROCESS, 0);
	if (errno)
		printf("getpriority\n");
	else if (setpriority(PRIO_PROCESS, 0, (int)niceness))
		printf("setpriority\n");
	execvp(*argv, argv);
	...
}

编译运行:
在这里插入图片描述

在这里插入图片描述
总结

在 Linux 中,nice 命令有助于运行修改了调度优先级的程序。 可以使用 nice 命令在启动之前设置进程的优先级。 但是你不能用 nice 命令改变正在运行的进程的优先级。可以使用 renice 命令来修改正在运行的进程的优先级。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值