如何使用 execv 生成后台程序

Posted

技术标签:

【中文标题】如何使用 execv 生成后台程序【英文标题】:How to spawn a background program with execv 【发布时间】:2011-04-27 08:17:47 【问题描述】:

我正在使用 fork 和 execv 来生成子程序。如何让这些程序在后台运行?我试着不等待他们,但他们仍然将输出发送到屏幕。

【问题讨论】:

你对“背景”的定义是什么? 在后台运行一个进程和程序&是一回事。 您的术语不一致 - program& 仍会将其输出写入屏幕,在这种情况下,“背景”只是释放 shell 提示符。 program > /dev/null& 会做你想做的事 不,不会的。 top & 不会在屏幕上显示任何内容。 【参考方案1】:

在执行之前将 stdout/stderr 重定向到 /dev/null

freopen("/dev/null", "w", stdout);
freopen("/dev/null", "w", stderr);
exec....

【讨论】:

我收到此错误:无法将参数 '2' 的 'FILE*' 转换为 'const char*' 到 'FILE* freopen(const char*, const char*, FILE*)'跨度> @z-buffer:我交换了一些参数,现在更正了答案。 输出如何恢复正常? @z-buffer: “恢复正常”?如果要隐藏/丢弃输出,请将其重定向到 /dev/null 如上所述。 exec 将永远不会返回【参考方案2】:

您可以使用管道重定向子进程的输出。看看thisqueston。有代码将 stdout 和 stderr 重定向到管道。

【讨论】:

以上是关于如何使用 execv 生成后台程序的主要内容,如果未能解决你的问题,请参考以下文章

计算机系统篇之异常控制流:利用 fork 和 execve 实现一个简易的 shell 程序

计算机系统篇之异常控制流:利用 fork 和 execve 实现一个简易的 shell 程序

如何在没有警告的情况下使用 execv()?

如何在不更改标准输入缓冲的情况下 fork-then-execve?

如何将字符串向量传递给execv

在堆栈上为execve创建一个arg数组