- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我将/proc/sys/kernel/core_pattern 设置为将核心转储管道传输到我的程序。该程序调用一个shell脚本(使用“系统”),该脚本又调用我的测试程序,附加。此测试程序尝试为任何 CPU 调用失败的 sched_setaffinity EINVAL。直接从 shell 脚本(以 root 身份运行)调用的相同测试程序可以正常工作。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <errno.h>
#include <string.h>
#include <string>
#include <sys/time.h>
#include <sys/resource.h>
#include <syslog.h>
typedef unsigned long long int UINT64;
// Functions to convert Linux CPU list to/from UINT64
static UINT64 GetCpuMask(cpu_set_t* cpuSet)
{
UINT64 mask = 0;
const int maxCpus = CPU_SETSIZE < 64?CPU_SETSIZE:64;
for (int cpu = 0; cpu < maxCpus; cpu++){
mask |= CPU_ISSET(cpu, cpuSet)? 1ll<<cpu : 0;
}
return mask;
}
static void GetCpuSet(UINT64 mask, cpu_set_t* cpuSet)
{
const int maxCpus = CPU_SETSIZE < 64?CPU_SETSIZE:64;
CPU_ZERO(cpuSet);
for (int cpu = 0; cpu < maxCpus; cpu++){
if (1ll<<cpu & mask){
CPU_SET(cpu, cpuSet);
}
}
}
UINT64 GetThreadAffinityMask()
{
cpu_set_t cpuSet;
if (!sched_getaffinity(0, sizeof(cpu_set_t), &cpuSet)){
return GetCpuMask(&cpuSet);
}
syslog (LOG_ERR, "sched_getaffinity fails, errno %d:%s", errno, strerror(errno));
return 0;
}
int main( int argc, char *argv[] )
{
// Temp test...
setlogmask (LOG_UPTO (LOG_INFO)); // unless overridden in config file
openlog ("proc3", LOG_CONS | LOG_PID | LOG_NDELAY, LOG_USER );
UINT64 old_mask=GetThreadAffinityMask();
syslog (LOG_INFO, "old_mask 0x%x", old_mask);
cpu_set_t testCpuSet;
for (int cpu = 0; cpu < 16; cpu++){
CPU_ZERO(&testCpuSet);
CPU_SET(cpu, &testCpuSet);
UINT64 try_mask = GetCpuMask(&testCpuSet);
if (!sched_setaffinity(0, sizeof(cpu_set_t), &testCpuSet)){
syslog (LOG_INFO, "sched_setaffinity OK, cpu %d (mask 0x%x)",cpu, try_mask);
UINT64 new_mask = GetThreadAffinityMask();
syslog (LOG_INFO, "new_mask 0x%x", new_mask);
} else {
syslog (LOG_INFO, "sched_setaffinity, cpu %d errno %d:%s", cpu, errno, strerror(errno));
}
}
}
Sep 19 11:42:43 apxdev-cjn-1 proc3[9122]: old_mask 0xf
Sep 19 11:42:43 apxdev-cjn-1 proc3[9122]: sched_setaffinity OK, cpu 0 (mask 0x1)
Sep 19 11:42:43 apxdev-cjn-1 proc3[9122]: new_mask 0x1
Sep 19 11:42:43 apxdev-cjn-1 proc3[9122]: sched_setaffinity OK, cpu 1 (mask 0x2)
Sep 19 11:42:43 apxdev-cjn-1 proc3[9122]: new_mask 0x2
Sep 19 11:42:43 apxdev-cjn-1 proc3[9122]: sched_setaffinity OK, cpu 2 (mask 0x4)
Sep 19 11:42:43 apxdev-cjn-1 proc3[9122]: new_mask 0x4
Sep 19 11:42:43 apxdev-cjn-1 proc3[9122]: sched_setaffinity OK, cpu 3 (mask 0x8)
Sep 19 11:42:43 apxdev-cjn-1 proc3[9122]: new_mask 0x8
Sep 19 11:42:43 apxdev-cjn-1 proc3[9122]: sched_setaffinity, cpu 4 errno 22:Invalid argument
Sep 19 11:42:43 apxdev-cjn-1 proc3[9122]: sched_setaffinity, cpu 5 errno 22:Invalid argument
Sep 19 11:42:43 apxdev-cjn-1 proc3[9122]: sched_setaffinity, cpu 6 errno 22:Invalid argument
Sep 19 11:42:43 apxdev-cjn-1 proc3[9122]: sched_setaffinity, cpu 7 errno 22:Invalid argument
Sep 19 11:42:43 apxdev-cjn-1 proc3[9122]: sched_setaffinity, cpu 8 errno 22:Invalid argument
Sep 19 11:42:43 apxdev-cjn-1 proc3[9122]: sched_setaffinity, cpu 9 errno 22:Invalid argument
Sep 19 11:42:43 apxdev-cjn-1 proc3[9122]: sched_setaffinity, cpu 10 errno 22:Invalid argument
Sep 19 11:42:43 apxdev-cjn-1 proc3[9122]: sched_setaffinity, cpu 11 errno 22:Invalid argument
Sep 19 11:42:43 apxdev-cjn-1 proc3[9122]: sched_setaffinity, cpu 12 errno 22:Invalid argument
Sep 19 11:42:43 apxdev-cjn-1 proc3[9122]: sched_setaffinity, cpu 13 errno 22:Invalid argument
Sep 19 11:42:43 apxdev-cjn-1 proc3[9122]: sched_setaffinity, cpu 14 errno 22:Invalid argument
Sep 19 11:42:43 apxdev-cjn-1 proc3[9122]: sched_setaffinity, cpu 15 errno 22:Invalid argument
Sep 19 11:50:25 apxdev-cjn-1 proc3[12372]: old_mask 0xf
Sep 19 11:50:25 apxdev-cjn-1 proc3[12372]: sched_setaffinity, cpu 0 errno 22:Invalid argument
Sep 19 11:50:25 apxdev-cjn-1 proc3[12372]: sched_setaffinity, cpu 1 errno 22:Invalid argument
Sep 19 11:50:25 apxdev-cjn-1 proc3[12372]: sched_setaffinity, cpu 2 errno 22:Invalid argument
Sep 19 11:50:25 apxdev-cjn-1 proc3[12372]: sched_setaffinity, cpu 3 errno 22:Invalid argument
Sep 19 11:50:25 apxdev-cjn-1 proc3[12372]: sched_setaffinity, cpu 4 errno 22:Invalid argument
Sep 19 11:50:25 apxdev-cjn-1 proc3[12372]: sched_setaffinity, cpu 5 errno 22:Invalid argument
Sep 19 11:50:25 apxdev-cjn-1 proc3[12372]: sched_setaffinity, cpu 6 errno 22:Invalid argument
Sep 19 11:50:25 apxdev-cjn-1 proc3[12372]: sched_setaffinity, cpu 7 errno 22:Invalid argument
Sep 19 11:50:25 apxdev-cjn-1 proc3[12372]: sched_setaffinity, cpu 8 errno 22:Invalid argument
Sep 19 11:50:25 apxdev-cjn-1 proc3[12372]: sched_setaffinity, cpu 9 errno 22:Invalid argument
Sep 19 11:50:25 apxdev-cjn-1 proc3[12372]: sched_setaffinity, cpu 10 errno 22:Invalid argument
Sep 19 11:50:25 apxdev-cjn-1 proc3[12372]: sched_setaffinity, cpu 11 errno 22:Invalid argument
Sep 19 11:50:25 apxdev-cjn-1 proc3[12372]: sched_setaffinity, cpu 12 errno 22:Invalid argument
Sep 19 11:50:25 apxdev-cjn-1 proc3[12372]: sched_setaffinity, cpu 13 errno 22:Invalid argument
Sep 19 11:50:25 apxdev-cjn-1 proc3[12372]: sched_setaffinity, cpu 14 errno 22:Invalid argument
Sep 19 11:50:25 apxdev-cjn-1 proc3[12372]: sched_setaffinity, cpu 15 errno 22:Invalid argument
最佳答案
随着内核版本的添加,一个答案:
看来 EINVAL
在 sched_setaffinity
电话是由于 PF_NO_SETAFFINITY
在任务标志中设置标志。在大多数内核线程中启用此标志以确保用户级程序不会以不适当的方式操纵内核线程的亲和性。
在更高版本的内核中,代码被添加到 flush_old_exec
fs/exec.c
中的函数导致在执行用户级帮助程序时清除标志(例如由管道 core_pattern
函数调用这里)。
OP 指定的内核版本的源代码位于 https://buildlogs.centos.org/c7.1511.u/kernel/20160217024115/3.10.0-327.10.1.el7.x86_64/ .清除 PF_SET_NOAFFINITY
的代码当执行用户模式程序时,此版本中不存在。
这个标志将被子进程继承(AFAICT:整个任务结构被复制,我看不到任何可以清除它的东西)。
根据https://www.kernel.org/doc/Documentation/filesystems/proc.txt , flags
值应该在 /proc/<pid>/stat
中可见(PF_SET_NOAFFINITY
在这个版本中是#defined 到 0x04000000)。您应该能够解码那里的值并确定是否设置了标志。
关于linux - 在 core_pattern 调用过程中调用 sched_setaffinity 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52405754/
我想在构建docker镜像的时候修改core_pattern,我的docker文件是这样的: FROM centos:7 RUN echo "core-%e" > /proc/sys/kernel/c
我将/proc/sys/kernel/core_pattern 设置为将核心转储管道传输到我的程序。该程序调用一个shell脚本(使用“系统”),该脚本又调用我的测试程序,附加。此测试程序尝试为任何
我最近开始使用 pthread_setname_np() 在我的应用程序中设置一些线程名称。执行此操作后,如果在其中一个命名线程中发生崩溃,则核心转储文件名将获取线程名称而不是具有 core_patt
如何在没有特权模式的情况下更改 docker 容器内的 /proc/sys/kernel/core_pattern 文件?是否有任何标志要传递给 docker daemon 或 docker run
$ cat /proc/sys/kernel/core_pattern |/usr/share/apport/apport %p %s %c %d %P “|”是什么意思意思是在文件 /proc/sy
我想在没有 root 访问权限的 Linux 系统上运行 American Fuzzy Lop (AFL) 模糊器。当我这样做时,发生的第一件事是它给我一条错误消息,要求我修改 /proc/sys/k
我是一名优秀的程序员,十分优秀!