2017-02-17 53 views
1

嗨,我只是想在OSX上使用posix_spawn,這應該工作找到(至於* nix)posix_spawn系統調用後,進程將收到SIGTRAP我真的不明白爲什麼。posix_spawn OSX錯誤sigtrap

#include <spawn.h> 
#include <stdio.h> 
#include <stdlib.h> 

int main() 
{ 

    while(1){ 
     char *newargv[] = { "/usr/bin/id", 0 }; 
     char *newenviron[] = {0}; 
     posix_spawnattr_t * a; 
     posix_spawn_file_actions_t * fa; 
     fa = malloc(0x80); 
     a = malloc(336); 
     //printf("size: %d\n", sizeof(posix_spawnattr_t)); 
     posix_spawnattr_init(a); 
     posix_spawnattr_setflags(a, 0x40); 
     posix_spawn_file_actions_init(fa); 
     pid_t pid; 
     int status = 0; 
     posix_spawn(&pid, "/usr/bin/id", fa, a, newargv, newenviron); 
     waitpid(pid, &status, 0); 
     printf("pid: %d\n", pid); 
    } 
    //printf("pid: %d\n", pid); 
    return 0; 
} 

它應該永遠運行,但id的輸出將只打印一次。

感謝您的支持!

+0

在Linux下沒有問題...對不起,我忍不住。 – Aubin

+0

拿出你已經硬編碼的所有可怕的幻數,並檢查所有函數調用的返回值。另外,你爲什麼每次都在循環中使用malloc而不是外部使用? –

回答

1

不確定你實際正在做什麼,因爲你的硬編碼常量和大小可能與macOS無關。

主要問題是您的0x40標誌意味着/usr/bin/id被執行 - 只需一次,並替換當前進程,以便它不會再次繞過循環!

其他問題應該從以下版本可見:

#include <spawn.h> 
#include <stdio.h> 
#include <stdlib.h> 

int main() 
{ 

    char *newargv[] = { "/usr/bin/id", 0 }; 
    char *newenviron[] = {0}; 
    posix_spawnattr_t a; 
    posix_spawnattr_init(&a); 
    // posix_spawnattr_setflags(&a, 0x40); exec & replace the current process !!! 
    pid_t pid; 
    int status = 0; 
    while(1){ 
     posix_spawn(&pid, "/usr/bin/id", NULL, &a, newargv, newenviron); 
     waitpid(pid, &status, 0); 
     printf("pid: %d\n", pid); 
    } 
    return 0; 
} 

您有什麼區別:

posix_spawnattr_t * a; 
a = malloc(336); 

和我有什麼:

posix_spawnattr_t a; 

是,首先,無論在任何特定操作系統上如何定義結構,我的大小都是正確的,而你的是一個硬編碼的數字對於任何特定的操作系統來說可能正確也可能不正確,其次,你的方法每次通過循環泄漏336字節的內存,假設循環中沒有延遲或其他任何東西,可能意味着更多一個噴水龍頭/水龍頭比一個小泄漏;-)

+0

這應該是一個幫助人們的網站,而不是猜測遊戲。請說明「其他問題」是什麼。 – JeremyP

+0

@JeremyP我會認爲工作代碼會非常有幫助!區別在於聲明'a',從而確保它是正確的大小,並且聲明一個指向隨機大小的內存塊的指針,該內存塊使用硬編碼大小進行了匹配。 –

+0

我並不是說這對工作代碼沒什麼幫助 - 這一點很好,謝謝 - 我說它說原始代碼有問題並沒有幫助,但是你不會告訴提問者他們是什麼。如果你在答案中提出了一個合適的大小,那麼你將得到我的最後一票。 – JeremyP