来自 <cpuset.h> 库的 cpuset_create Ubuntu 20.04 和 16.04 之间的实现差异

问题描述

我正在尝试将用 C 编写的项目从 Ubuntu 16.04 移植到 Ubuntu 20.04。该项目严重依赖于 <cpuset.h> 共享库。当我尝试在 Ubuntu 20.04 上使用 cpuset_create 时出现问题。

函数 cpuset_create/dev/cpuset/ 中创建一个具有指定名称的新目录。该目录包含 cpuset 的相关伪文件,所有这些文件都以前缀“cpuset.”开头。以下代码显示了在 Ubuntu 16.04 上使用 cpuset_create 创建 cpuset AFF_1000 后的目录内容

$ ll /dev/cpuset/AFF_1000/
total 0
drwxr-xr-x 2 root   root 0 Mar 12 11:41 ./
drwxrwxr-x 4 shivam root 0 Mar 12 11:38 ../
-rw-r--r-- 1 root   root 0 Mar 12 11:42 cgroup.clone_children
-rw-r--r-- 1 root   root 0 Mar 12 11:42 cgroup.procs
-rw-r--r-- 1 root   root 0 Mar 12 11:42 cpuset.cpu_exclusive
-rw-r--r-- 1 root   root 0 Mar 12 11:42 cpuset.cpus
-r--r--r-- 1 root   root 0 Mar 12 11:42 cpuset.effective_cpus
-r--r--r-- 1 root   root 0 Mar 12 11:42 cpuset.effective_mems
-rw-r--r-- 1 root   root 0 Mar 12 11:42 cpuset.mem_exclusive
-rw-r--r-- 1 root   root 0 Mar 12 11:42 cpuset.mem_hardwall
-rw-r--r-- 1 root   root 0 Mar 12 11:42 cpuset.memory_migrate
-r--r--r-- 1 root   root 0 Mar 12 11:42 cpuset.memory_pressure
-rw-r--r-- 1 root   root 0 Mar 12 11:42 cpuset.memory_spread_page
-rw-r--r-- 1 root   root 0 Mar 12 11:42 cpuset.memory_spread_slab
-rw-r--r-- 1 root   root 0 Mar 12 11:42 cpuset.mems
-rw-r--r-- 1 root   root 0 Mar 12 11:42 cpuset.sched_load_balance
-rw-r--r-- 1 root   root 0 Mar 12 11:42 cpuset.sched_relax_domain_level
-rw-r--r-- 1 root   root 0 Mar 12 11:42 notify_on_release
-rw-r--r-- 1 root   root 0 Mar 12 11:42 tasks

但是,当我尝试在 Ubuntu 20.04 上使用相同的函数时,它失败并返回错误代码 -1。我用strace调试代码,发现如下问题(高亮线):

cpuset_create error

似乎 cpuset_create 试图制作没有 "cpuset." 前缀的伪文件。我在 Ubuntu 16.04 上使用 strace 执行了相同的程序,它可以正常工作,并得到以下输出(突出显示的行):

correct output

基于此,我有以下问题:

  1. 为什么 cpuset_create 打开路径 /sys/fs/cgroup/cpuset/ 以在 Ubuntu 16.04 上创建 cpuset,而在 Ubuntu 20.04 上它尝试在 /dev/cpuset/ 创建它?
  2. 为什么 Ubuntu 20.04 的 strace 输出使用 openat 而 Ubuntu 16.04 的 strace 输出使用 open
  3. 为什么 Ubuntu 20.04 上的 cpuset_create 在创建伪文件时省略了 "cpuset." 前缀?

非常感谢任何帮助。提前致谢。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)