2017-02-17 2 views
1

Привет, я просто пытаюсь использовать posix_spawn на OSX, это должно работать find (как для * nix) в любом случае после sysall posix_spawn, процесс получит SIGTRAP, я действительно не могу понять, почему.posix_spawn OSX error 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; 
} 

Он должен работать вечно, но вывод идентификатора будет напечатан только один раз.

Спасибо за вашу поддержку!

+0

Нет проблем под Linux ... Извините, я не могу помочь. – Aubin

+0

Выньте все ужасные магические числа, в которые вы жестко закодированы, и проверьте возвращаемые значения всех ваших вызовов функций. Кроме того, почему вы mallocing вещи каждый раз вокруг цикла, а не один раз снаружи? –

ответ

1

Не уверен, что вы на самом деле пытаетесь сделать, потому что у вас есть жестко заданные константы и размеры, которые могут не иметь отношения к macOS.

Основная проблема заключается в том, что ваш флаг 0x40 означает, что /usr/bin/id является exec'ed - только один раз и заменяет текущий процесс, чтобы он не обходил цикл снова!

Другие проблемы должны быть видны из следующей версии:

#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