2017-02-17 6 views
1

こんにちは私はposix_spawnをOSXで使用しようとしていますが、これはposix_spawnの後の検索で問題ありません。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の出力は1回だけ表示されます。

ご協力いただきありがとうございます。

+0

申し訳ありませんが、私は助けることはできません。 – Aubin

+0

ハードコードされている恐ろしい魔法の数字をすべて取り出し、すべての関数呼び出しの戻り値をチェックします。また、ループの周りではなく、いつも外から一度に物を集めているのですか? –

答えて

1

実際に何をしようとしているのか分かりません。これは、ハードコードされた定数とサイズがmacOSには関係しないためです。

主な問題は、0x40フラグは、/usr/bin/idがexec'edであることを意味します。現在のプロセスを1回だけ置き換えて、再びループを回らないようにします。

#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; 

は、まずあり、どのように特定のOSで構造が定義されていても、私のサイズは正しいですが、あなたのハードコードされた番号で、特定のOSで正しいかもしれないし、正しくないかもしれません。そして、あなたの方法は毎回ループを通して336バイトのメモリをリークします。マイナーなリークより噴出するタップ/蛇口;-)

+0

これは、ゲームを推測するのではなく、人々を援助するサイトであると考えられています。 「その他の問題」が何であるかを明記してください。 – JeremyP

+0

@JeremyP私は作業コードが非常に役に立つと思ったでしょう!相違点は 'a'を宣言することによって正しいサイズであることを保証し、ハードコードされたサイズを使用してmallocされたランダムなサイズのメモリの一塊へのポインタを宣言することです。 –

+0

元のコードに問題はありますが、質問者には何を教えていないと言っても意味がないと言っています。あなたの答えに正しいサイズを作ることについてのビットを入れれば、あなたは私の上の投票をするでしょう。 – JeremyP

関連する問題