首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >sched_setaffinity在core_pattern调用过程中调用时失败

sched_setaffinity在core_pattern调用过程中调用时失败
EN

Stack Overflow用户
提问于 2018-09-19 12:20:28
回答 1查看 1.2K关注 0票数 2

我将/proc/sys/ core /core_pattern设置为将核心转储输送到我的程序。这个程序调用一个shell脚本(使用"system"),它反过来调用我的测试程序,附加。此测试程序尝试调用sched_setaffinity,该程序对任何CPU都失败。从shell脚本直接调用的同一个测试程序(以root形式运行)可以正常工作。

代码语言:javascript
运行
复制
#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));
        }
    }
}

直接从根shell调用时记录的输出:

代码语言:javascript
运行
复制
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

从转储钩子调用时记录的输出:

代码语言:javascript
运行
复制
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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-09-20 16:12:46

添加内核版本后,回答如下:

看来,EINVALsched_setaffinity调用中是由于任务标志中设置了PF_NO_SETAFFINITY标志。在大多数内核线程中启用了此标志,以确保用户级程序不会以不适当的方式操作内核线程的关联。

在内核的以后版本中,代码被添加到fs/exec.c中的fs/exec.c函数中,导致在用户级帮助程序被执行时清除标志(例如这里由管道core_pattern函数调用的)。

OP指定的内核版本的源代码可在64/上使用。在执行用户模式程序时清除PF_SET_NOAFFINITY的代码不在此版本中。

这个标志将由子进程继承(AFAICT:整个任务结构被复制,我看不到任何清除它的东西)。

根据https://www.kernel.org/doc/Documentation/filesystems/proc.txtflags值应该在/proc/<pid>/stat中可见(此版本中的PF_SET_NOAFFINITY定义为0x04000000)。您应该能够解码那里的值,并确定是否设置了标志。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52405754

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档