代码之家  ›  专栏  ›  技术社区  ›  anthony

OSX:为什么GetProcessInformation()会导致segfault?

  •  4
  • anthony  · 技术社区  · 15 年前

    下面是我的C方法来获取Finder进程的pid。GetProcessInformation()导致segfault。为什么?

    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
    
    2 回复  |  直到 15 年前
        1
  •  5
  •   anthony    15 年前

    将ProcessInfoRect结构归零是可行的,而不是试图确定哪些字段应该归零。

        2
  •  2
  •   Azeem.Butt    15 年前

    如果不希望返回processAppSpec,则需要将其设置为nil,否则会出现无效指针。