posix_spawn OSX错误sigtrap

时间:2017-02-17 12:09:42

标签: c macos

你好我只是想在OSX上使用posix_spawn,这应该可以找到(至于* nix)无论如何在posix_spawn后调用syscall进程将接收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 :(得分: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个字节的内存,考虑到循环中没有任何延迟或其他任何东西,可能意味着更多的涌出水龙头/水龙头而不是轻微泄漏; - )