2017-02-17 3 views
1

Hallo, ich versuche nur, posix_spawn auf OSX zu verwenden, das sollte funktionieren (wie für * nix) sowieso nach posix_spawn syscall der Prozess wird SIGTRAP erhalten, ich kann wirklich nicht verstehen, warum.posix_spawn OSX-Fehler 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; 
} 

Es sollte für immer laufen, aber die Ausgabe von ID wird nur einmal gedruckt.

Vielen Dank für Ihre Unterstützung!

+0

Kein Problem unter Linux ... Sorry, ich kann nicht helfen. – Aubin

+0

Nehmen Sie alle schrecklichen magischen Zahlen heraus, die Sie fest programmiert haben, und überprüfen Sie die Rückgabewerte aller Ihrer Funktionsaufrufe. Warum mallokierst du auch jedes Mal auf der Schleife, anstatt einmal draußen? –

Antwort

1

Nicht sicher, was Sie eigentlich tun möchten, weil Sie fest codierte Konstanten und Größen haben, die auf macOS nicht relevant sind.

Das Hauptproblem ist, dass Ihre 0x40 Flag bedeutet, dass /usr/bin/id ausgeführt wird - nur einmal und ersetzt den aktuellen Prozess, so dass es nicht wieder die Schleife geht!

Andere Probleme sollten unter der Version zu sehen sein:

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

Der Unterschied zwischen dem, was Sie haben:

posix_spawnattr_t * a; 
a = malloc(336); 

und was ich habe:

posix_spawnattr_t a; 

ist, dass zum einen , meins ist die richtige Größe, egal wie die Struktur auf einem bestimmten Betriebssystem definiert ist, während Ihre ist a fest codierte Zahl, die für ein bestimmtes Betriebssystem korrekt sein kann oder auch nicht, und zweitens verliert Ihre Methode jedes Mal 336 Byte Speicher durch die Schleife, was angesichts der Tatsache, dass es keine Verzögerung oder irgend etwas anderes in der Schleife gibt, mehr bedeuten könnte ein sprudelnder Hahn/Wasserhahn als ein kleines Leck ;-)

+0

Dies soll eine Seite sein, um Menschen zu helfen, nicht um Spiele zu erraten. Bitte geben Sie an, was die "anderen Probleme" sind. – JeremyP

+0

@ JeremyP Ich hätte gedacht, dass Arbeitscode sehr hilfreich wäre! Der Unterschied liegt zwischen dem Erklären von "a", wodurch sichergestellt wird, dass es die richtige Größe hat, und dem Deklarieren eines Zeigers auf einen Klumpen von zufällig bemessenem Speicher, der unter Verwendung einer fest codierten Größe mallociert wurde. –

+0

Ich sage nicht, dass es nicht hilfreich ist, Arbeitscode zu haben - dieses Bit ist gut, danke - ich sage, es ist nicht hilfreich zu sagen, dass der ursprüngliche Code Probleme hat, aber Sie sagen dem Fragesteller nicht, was sie sind. Wenn Sie in Ihrer Antwort die richtige Größe angeben, haben Sie meine Stimme. – JeremyP

Verwandte Themen