gpt4 book ai didi

c - posix_spawn OSX 错误信号陷阱

转载 作者:太空宇宙 更新时间:2023-11-04 03:24:35 26 4
gpt4 key购买 nike

您好,我只是想在 OSX 上使用 posix_spawn,无论如何在 posix_spawn 系统调用之后,这应该可以找到(对于 *nix),进程将收到 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 的输出只会打印一次。

感谢您的支持!

最佳答案

不确定您实际尝试做什么,因为您有硬编码的常量和大小,这在 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 字节的内存,如果循环中没有延迟或其他任何东西,这可能意味着更多的是涌出的水龙头/水龙头而不是轻微的泄漏 ;-)

关于c - posix_spawn OSX 错误信号陷阱,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42297630/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com