Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将进程添加到具有指定组的作业后,无法设置处理器相关性_C#_Winapi_Process_Processor_Affinity - Fatal编程技术网

C# 将进程添加到具有指定组的作业后,无法设置处理器相关性

C# 将进程添加到具有指定组的作业后,无法设置处理器相关性,c#,winapi,process,processor,affinity,C#,Winapi,Process,Processor,Affinity,我基本上是尝试使用指定的NUMA组和处理器关联启动一个新进程。 我用C#做这件事。 设置进程的ProcessorAffinity属性对我不起作用,因为它只对第一个NUMA组起作用 我正在创建作业对象,为作业设置组,然后将流程添加到作业中。 这将更改流程的NUMA组。但是,一旦我这样做了,我就无法为进程设置处理器亲缘关系 SetProcessAffinityMask返回true,但GetProcessAffinityMask返回与前面相同的值 在将进程添加到作业之前设置关联掩码是有效的,但一旦将进

我基本上是尝试使用指定的NUMA组和处理器关联启动一个新进程。 我用C#做这件事。 设置进程的
ProcessorAffinity
属性对我不起作用,因为它只对第一个NUMA组起作用

我正在创建作业对象,为作业设置组,然后将流程添加到作业中。 这将更改流程的NUMA组。但是,一旦我这样做了,我就无法为进程设置处理器亲缘关系

SetProcessAffinityMask
返回true,但
GetProcessAffinityMask
返回与前面相同的值

在将进程添加到作业之前设置关联掩码是有效的,但一旦将进程添加到作业,关联就会得到

我的测试代码(如下)将以下内容写入控制台:

  • 正在将SetProcessAffinityMask调用到1
  • GetProcessAffinityMask现在返回1
  • 正在将作业组设置为0
  • 将进程添加到作业中
  • GetProcessAffinityMask现在返回15
  • 再次调用将SetProcessAffinityMask设置为1
  • GetProcessAffinityMask现在返回15
我希望在将进程添加到作业时,
GetProcessAffinityMask
返回的最后一个值为1,或者根本不更改为15

任何帮助都将不胜感激

using System;
using System.Diagnostics;
using System.Runtime.InteropServices;
namespace ChangeGroupUsingJob
{
    class Program
    {
        static void Main(string[] args)
        {
            // start the process
            var process = new Process
            {
                StartInfo = new ProcessStartInfo
                {
                    FileName = "notepad.exe"
                }
            };

            process.Start();

            UIntPtr targetAffinityMask = new UIntPtr(1);

            Console.WriteLine("Calling SetProcessAffinityMask to " + targetAffinityMask);

            if (!SetProcessAffinityMask(process.Handle, targetAffinityMask))
                Console.WriteLine("Error code: " + Marshal.GetLastWin32Error());

            ReportProcessAffinityMask(process);

            // create job
            var jobObjectHandle = CreateJobObject(IntPtr.Zero, null);

            ushort group = 0;
            int length = Marshal.SizeOf(typeof(ushort));
            IntPtr groupInfoPtr = Marshal.AllocHGlobal(length);
            Marshal.StructureToPtr(group, groupInfoPtr, false);

            Console.WriteLine("Setting job group to " + group);

            // set job info
            var jobInfoSet = SetInformationJobObject(jobObjectHandle, JobObjectInfoType.GroupInformation, groupInfoPtr, (uint)length);

            Console.WriteLine("Adding process to the job.");

            // assign process to the job
            var processAddedToJob = AssignProcessToJobObject(jobObjectHandle, process.Handle);

            ReportProcessAffinityMask(process);

            Console.WriteLine("Calling again SetProcessAffinityMask to " + targetAffinityMask);

            if (!SetProcessAffinityMask(process.Handle, targetAffinityMask))
                Console.WriteLine("Error code: " + Marshal.GetLastWin32Error());

            ReportProcessAffinityMask(process);

            // close the job (process should still keep running)
            var handleClosed = CloseHandle(jobObjectHandle);

            Console.ReadLine();
        }

        private static void ReportProcessAffinityMask(Process process)
        {
            UIntPtr processAffinityMask;
            UIntPtr systemAffinityMask;
            bool getProcessAffinityMaskSuccess;
            getProcessAffinityMaskSuccess = GetProcessAffinityMask(process.Handle, out processAffinityMask, out systemAffinityMask);
            Console.WriteLine("GetProcessAffinityMask now returns " + processAffinityMask);
        }

        [DllImport(dllName: "kernel32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
        static extern IntPtr CreateJobObject(IntPtr securityAttributes, string name);

        [DllImport(dllName: "kernel32.dll", SetLastError = true)]
        static extern bool CloseHandle(IntPtr handle);

        [DllImport("kernel32.dll")]
        static extern bool SetInformationJobObject(IntPtr hJob, JobObjectInfoType infoType, IntPtr lpJobObjectInfo, UInt32 cbJobObjectInfoLength);

        [DllImport("kernel32.dll", SetLastError = true)]
        static extern bool AssignProcessToJobObject(IntPtr job, IntPtr process);

        [DllImport("kernel32.dll", SetLastError = true)]
        static extern bool SetProcessAffinityMask(IntPtr process, UIntPtr processAffinityMask);

        [DllImport("kernel32.dll", SetLastError = true)]
        static extern bool GetProcessAffinityMask(IntPtr hProcess, out UIntPtr lpProcessAffinityMask, out UIntPtr lpSystemAffinityMask);

        public enum JobObjectInfoType
        {
            AssociateCompletionPortInformation = 7,
            BasicLimitInformation = 2,
            BasicUIRestrictions = 4,
            EndOfJobTimeInformation = 6,
            ExtendedLimitInformation = 9,
            SecurityLimitInformation = 5,
            GroupInformation = 11
        }
    }
}