Linux下C++设置zip进程优先级为-20失败求助
解决Linux中设置zip进程优先级无效的问题
问题核心分析
你的代码存在两个关键问题,导致优先级设置始终无效:
- 优先级设置对象错误:
setpriority修改的是当前C++进程的优先级,但system启动的sudo zip是全新子进程——由于sudo会切换用户身份,新进程的优先级会被强制重置为默认值0,完全不受父进程设置的影响。 - 优先级检查对象错误:最后调用
getpriority获取的是当前C++进程的优先级,而非zip进程的,所以看到的0并不是zip的实际优先级。 - 额外问题:你没有检查
setpriority的返回值,普通用户设置负优先级会直接因权限不足失败;即使以root运行,后续sudo启动新进程也会导致优先级重置。
解决方案
方案一:用nice直接为zip指定优先级
nice命令可以在启动进程时直接设置优先级,结合sudo可获得设置负优先级的权限,这是最简单的修改方式。
修改后的代码:
#include <iostream> #include <string> #include <cstdlib> #include <cerrno> #include <cstring> using namespace std; int main() { int prio; cout << "Enter priority: "; cin >> prio; string path; cout << "Enter file path: "; cin >> path; // 用nice为zip进程设置指定优先级 string command = "sudo nice -n " + to_string(prio) + " zip -j " + path + ".zip " + path; int ret = system(command.c_str()); if (ret == -1) { cerr << "执行命令失败: " << strerror(errno) << endl; return 1; } // 验证zip优先级可在其运行时执行以下命令: // ps -o pid,nice -C zip return 0; }
方案二:用fork+exec手动控制子进程优先级
如果不想依赖nice和sudo,可直接在代码中创建子进程,设置优先级后启动zip。注意程序需要以root身份运行(才能设置负优先级)。
修改后的代码:
#include <iostream> #include <sys/resource.h> #include <unistd.h> #include <sys/wait.h> #include <string> #include <cerrno> #include <cstring> using namespace std; int main() { int prio; cout << "Enter priority: "; cin >> prio; string path; cout << "Enter file path: "; cin >> path; pid_t pid = fork(); if (pid == -1) { cerr << "创建子进程失败: " << strerror(errno) << endl; return 1; } else if (pid == 0) { // 子进程中设置优先级 if (setpriority(PRIO_PROCESS, 0, prio) == -1) { cerr << "设置优先级失败: " << strerror(errno) << endl; exit(1); } // 启动zip命令,参数列表以nullptr结尾 execlp("zip", "zip", "-j", (path + ".zip").c_str(), path.c_str(), nullptr); // 如果execlp返回,说明执行失败 cerr << "启动zip失败: " << strerror(errno) << endl; exit(1); } else { // 父进程等待子进程完成 int status; waitpid(pid, &status, 0); cout << "zip进程执行结束,状态码: " << status << endl; } return 0; }
内容的提问来源于stack exchange,提问作者Yura Tseplitskiy
相关产品推荐
相关产品推荐

