OSX:なぜGetProcessInformationは()セグメンテーションフォルトを引き起こしているのですか?

StackOverflow https://stackoverflow.com/questions/2589501

  •  25-09-2019
  •  | 
  •  

質問

ここでFinderのプロセスのPIDを取得するために私のCの方法があります。 GetProcessInformation()は、セグメンテーション違反を引き起こしています。なぜ?

ここでは機能があります:

static OSStatus
GetFinderPID(pid_t *pid)
{
    ProcessSerialNumber psn = {kNoProcess, kNoProcess};
    ProcessInfoRec info;
    OSStatus status = noErr;

    info.processInfoLength = sizeof(ProcessInfoRec);
    info.processName = nil;

    while (!status)
    {
        status = GetNextProcess(&psn);
        if (!status)
        {
            status = GetProcessInformation(&psn, &info);
        }
        if (!status &&
            info.processType == 'FNDR' &&
            info.processSignature == 'MACS')
        {
            return GetProcessPID(&psn, pid);
        }
    }

    return status;
}

ここでバックトレースがあります:

Program received signal EXC_BAD_ACCESS, Could not access memory.
Reason: KERN_INVALID_ADDRESS at address: 0x0000000032aaaba7
0x00007fffffe00623 in __bzero ()
(gdb) bt
#0  0x00007fffffe00623 in __bzero ()
#1  0x00007fff833adaed in CreateFSRef ()
#2  0x00007fff833ab53b in FSPathMakeRefInternal ()
#3  0x00007fff852fc32d in _CFGetFSRefFromURL ()
#4  0x00007fff852fbfe0 in CFURLGetFSRef ()
#5  0x00007fff85dd273f in GetProcessInformation ()
#6  0x0000000100000bef in GetFinderPID [inlined] () at /path/to/main.c:21
役に立ちましたか?

解決

零化ProcessInfoRect構造体ではなく、個々のフィールドはゼロにすべきかを決定しようとするよりも、働いています。

他のヒント

あなたは、あなたがそこに無効なポインタを持っているそれ以外の場合は、それが返されたくない場合はnilにprocessAppSpecを設定する必要があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top