你好我只是想在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的输出只打印一次。
感谢您的支持!
答案 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个字节的内存,考虑到循环中没有任何延迟或其他任何东西,可能意味着更多的涌出水龙头/水龙头而不是轻微泄漏; - )