【问题标题】:Can't get control back after execvp and wait()execvp 和 wait() 后无法重新获得控制权
【发布时间】:2013-07-09 04:35:52
【问题描述】:

我正在编写一个小 shell,它必须执行我解析的命令。

f 是这样的字符**:[ls][-la] p 是一样的,像这样使用:[wc] 所以我试图在 wc 中使用管道 ls -la 。 我的问题是,当我执行适用于管道的“ls -la | wc && date”时,我的 minishell 被关闭并且它不执行“date”。我使用了等待功能来等待它完成,但什么也没做。看起来它在第二个 execvp 之后卡住并退出。

我的数组以 NULL 结束。 ls -la | wc 执行得很好,但在此之后我又回到了 bash。 我已经尝试过 execlp 和 execl 但我认为这不是问题,因为我需要我的第一个参数(ls + -la)的选项。 请问你能帮帮我吗 ? 在此先感谢:)

【问题讨论】:

    标签: c shell controls fork execvp


    【解决方案1】:

    所有形式的exec 永不返回;他们用指定的可执行文件替换当前运行的映像。这里的关键词是“替换”。

    调用exec* 之后的语句被执行的唯一情况是exec 失败(例如,如果它找不到可执行文件)。

    【讨论】:

    • 好的,谢谢,我明白了。你知道为什么我没有回到我的 shell 但我在我的管道之后又回到了 bash 吗?
    • @user2145240: execution() 永远不会返回,所以你永远不会回到你的 shell。您的 shell 已替换为 ls,因此当 ls 终止时,您将返回 bash。
    • @user2145240: 你不能,除非你在子进程中运行管道的 both 边。所以一共需要三个进程:shell、管道左侧的实用程序和管道右侧的实用程序。
    • 是的,这就是我写的。在初始代码中,第一个 execvp 被我的 main 函数解析命令更改,第二个 execvp 被分叉。该命令有效,但我仍然无法控制 :(
    • @user2145240: exec 没有创建进程。 fork 创建一个进程。 exec 替换进程的映像,但它创建一个新进程。只有 fork 会创建一个进程。 (fork 返回两次。exec 永远不会返回。将返回加起来 :))
    猜你喜欢
    • 2013-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-08
    • 2011-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多