2017-02-17 65 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