微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

无法设置进程时钟的时间,我需要一些权限吗?

如何解决无法设置进程时钟的时间,我需要一些权限吗?

在我的 C 程序中,我尝试使用命令 clock_settime(CLOCK_PROCESS_cpuTIME_ID,...) 设置进程时钟的时间,但我收到无效参数错误 EINVAL

#include<time.h>
#include<stdio.h>
int main(void)
{
        struct timespec a;
        clock_gettime(CLOCK_PROCESS_cpuTIME_ID,&a);
        fprintf(stdout,"Current process time: %d %d\n",a.tv_sec,a.tv_nsec);
        
        a.tv_sec=0; 
        a.tv_nsec=0;
        
        fprintf(stdout,"Resetting process time status: %d\n",clock_settime(CLOCK_PROCESS_cpuTIME_ID,&a));
        clock_gettime(CLOCK_PROCESS_cpuTIME_ID,a.tv_nsec);
        return 0;
}
 

strace 输出

clock_settime(CLOCK_PROCESS_cpuTIME_ID,{0,0}) = -1 EINVAL (Invalid argument)
write(1,"Resetting process time status: -"...,34Resetting process time status: -1

这是我第一次玩时钟。我需要一些特权才能设置这个时钟的时间,还是有一些逻辑错误

解决方法

在 Linux 上,CLOCK_PROCESS_CPUTIME_IDCLOCK_THREAD_CPUTIME_ID 时钟不可设置。这在 man 2 clock_getres 联机帮助页的不同地方都有注明,包括上面链接的 NOTES 部分:

根据 POSIX.1-2001,具有“适当权限”的进程可以使用 CLOCK_PROCESS_CPUTIME_ID 设置 CLOCK_THREAD_CPUTIME_IDclock_settime() 时钟。在 Linux 上,这些时钟是不可设置的(即,没有进程具有“适当的权限”)。

(该文本大约在一年前从 BUGS 移至 NOTES,因此如果您最近没有更新联机帮助页,您会在 BUGS 中找到它,靠近结束。大约在移至 NOTES 的同时,这两个时钟的单独描述中也有注明。)

联机帮助页的最新版本还列出了 EINVAL 返回码的可能原因(这一直是可能的原因,但只是最近才记录)。

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