2010-04-07 2 views
4

Вот мой метод C, чтобы получить pid процесса Finder. GetProcessInformation() вызывает segfault. Зачем?OSX: Почему 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 

ответ

5

обнуление ProcessInfoRect структура работала, а не пытаться определить, какие отдельные поля должны быть обнулены.

+0

Я инициализировал 'procinfo' следующим образом: bzero (& procInfo, sizeof (ProcessInfoRec)); procInfo.processInfoLength = sizeof (ProcessInfoRec); –

+2

procinfo = {0}; – anthony

2

Вам нужно установить processAppSpec равным нулю, если вы не хотите, чтобы он был возвращен, иначе у вас есть недопустимый указатель.

+1

processAppSpec, похоже, не существует на Snow Leopard – anthony

+0

FSSpecs не существует в Snow Leopard. –

Смежные вопросы