- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用 posix_spawn() 创建一个新的子进程。子进程启动后,调用者进程应该继续运行。
TLDR:为什么 posix_spawn() 返回 0(成功),即使子可执行文件的路径无效(不存在)?在这种情况下以及 posix_spawn 实际上失败但返回成功的任何其他情况下,如何正确检测错误?
我尝试了以下代码。
/* The CALLER process*/
int main(int argc, char *argv) {
int status, pid;
printf("CALLER - Start\n");
char *args[] = {"/home/<user>/child_exec", NULL};
status = posix_spawn(&pid, args[0], NULL, NULL, args, environ);
printf("Status: %d; PID: %d\n", status, pid);
printf("CALLER - End\n");
return 0;
}
/* The CHILD process */
int main() {
printf("From CHILD\n");
return 0;
}
当我运行带有正确子可执行文件路径的调用程序时,它按预期运行。 posix_spawn 的状态为 0,并打印来自子进程的字符串。
CALLER - Start
Status: 0; PID: 5110
CALLER - End
From CHILD
现在,当我使用无效的子可执行路径(例如/home/user/child_exec123)运行同一个程序时,即使子进程尚未执行,它仍然返回状态 0。
CALLER - Start
Status: 0; PID: 5251
CALLER - End
对于这种子路径不存在的情况,我可以在调用 posix_spawn() 之前检查文件是否存在。但是,如果存在其他类似 posix_spawn() 实际上失败但返回 0 的错误怎么办?我如何发现是否有错误?
最佳答案
来自手册页(特别是第二段):
RETURN VALUE
Upon successful completion, posix_spawn() and posix_spawnp() place the
PID of the child process in pid, and return 0. If there is an error
before or during the fork(2), then no child is created, the contents of
*pid are unspecified, and these functions return an error number as de‐
scribed below.
Even when these functions return a success status, the child process
may still fail for a plethora of reasons related to its pre-exec() ini‐
tialization. In addition, the exec(3) may fail. In all of these
cases, the child process will exit with the exit value of 127.
您需要使用 wait*
函数之一来检查您的子进程的结果。无论如何,这都是个好主意,否则你就会变成僵尸。
关于c++ - posix_spawn() : Problem with error handling when using posix_spawn(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62787927/
我正在尝试使用 posix_spawn() 创建一个新的子进程。子进程启动后,调用者进程应该继续运行。 TLDR:为什么 posix_spawn() 返回 0(成功),即使子可执行文件的路径无效(不存
我正在编写一个小程序,它有点像一个服务器,它产生它的客户端程序(在本地,而不是通过网络)并在它们之间做一些有趣的事情。虽然我使用的主要操作系统是 Linux,但我希望它能在包括 Windows 在内的
我正在尝试使用 posix_spawn() 生成一个子进程.我给出了可执行文件名称(存在)但是 posix_spawn()创建一个僵尸进程(我在 ps 中搜索该进程,它显示为 )。即使我指定了一个不
我正在尝试使用posix_spawn而不是fork/exec来获得一些性能提升。我当前的项目是用Python编写的,所以我使用了this Python 绑定(bind)。我还尝试了它的一些分支,之后我
您好,我只是想在 OSX 上使用 posix_spawn,无论如何在 posix_spawn 系统调用之后,这应该可以找到(对于 *nix),进程将收到 SIGTRAP,我真的无法理解为什么。 #in
我从 here 中找到了使用 posix_spaw() 的示例代码. 在该页面中,run_cmd() 定义如下。 void run_cmd(char *cmd) { ... statu
ProcessBuilder.start 和 Runtime.exec 似乎在 *NIX 系统上使用 fork(),这似乎为子进程分配了与父进程相同数量的内存(参见例如 this question )
我想使用 posix_spawn(...) (或非常类似的东西)生成一组进程。此函数接受类型为 posix_spawn_file_actions_t 的参数,它允许我指定应如何处理打开的文件句柄。从我
我正在使用以下代码在 Linux 中启动新进程 pid_t processID; char *argV[] = {"192.168.1.40",(char *) 0}; int status = -1
我有一个 rsync 守护进程正在运行,我可以成功执行以下命令: rsync --port=1873 -avWh 127.0.0.1::jackfruit_peers/data.0a6/home/v/
我正在计算包含数百万个文件(每个大约 1K)的文件夹的大小,而 NSFileManager/NSDirectoryEnumerator 只是无法削减它。 我突然想到要在 Unix 级别而不是 Fo
我有以下代码片段。 char *const parmList[] = {"sh", "-c", "whoami", NULL}; if(geteuid() == 0) { seteuid(ato
OSX 手册页在 posix_spawn 中提到了 POSIX_SPAWN_SETEXEC 位系统调用: POSIX_SPAWN_SETEXEC Apple Extension: If this bi
所以我看到头文件 spawn.h 大量使用了'restrict': extern int posix_spawn (pid_t *__restrict __pid, const cha
虽然内核将页(和页表)标记为写时复制以使 fork 系统调用高效工作,但页表和相关结构的创建和拆除仍然是一项昂贵的任务。 因此,我想知道为什么 linux 社区从未设法将 posix_spawn 实现
我继承了一个遗留应用程序,它使用 ProcessBuilder.start() 在 Solaris 10 服务器上执行脚本。 不幸的是,由于内存问题,此脚本调用失败,如文档所述here Oracle
对于 the posix_spawn function它的原型(prototype)是: int posix_spawn(pid_t *restrict pid, const char *restri
我很好奇是否可以实现 posix_spawn在 Linux 中使用 vfork+exec 的组合。以一种非常简化的方式(省略大多数可选参数),这看起来或多或少像这样: int my_posix_spa
此问题是 this question 的后续问题. 当 posix_spawn() 发出 bash 命令时,我收到消息: bash: no job control in this shell 我认为是
我成功地使用 popen() 从我的 C 程序中运行命令。据我了解,它在幕后使用了 fork() 和 exec()(或它们的变体)。这非常有效: FILE *fd = popen("xterm", "
我是一名优秀的程序员,十分优秀!