【问题标题】:Executing a different program from my C program执行与我的 C 程序不同的程序
【发布时间】:2012-08-03 10:55:50
【问题描述】:

我的业余爱好是在 Linux 中编写一个基本的 shell,我想开始执行程序,但不知道如何执行此操作。我见过execp() 及其各种兄弟姐妹,但显然这会迫使内核放弃当前正在运行的进程,在这种情况下是我的shell,并继续使用新进程。

所以基本上我只需要一个函数,我可以用它来调用命令,例如 lscd 让它执行然后返回到我的 shell。

感谢所有帮助。

【问题讨论】:

    标签: c shell execution


    【解决方案1】:

    ouah 的回答基本正确,但不适用于cd。您的 shell 需要将其实现为内置命令(即 shell 需要包含 cd 的代码。

    这样做的原因是fork 首先创建了当前进程的新副本(在本例中为正在运行的 shell 实例)。然后 exec 用您要运行的可执行文件覆盖新进程。当命令完成时,新进程终止并消失。如果您将其用于cd,它将更改新进程的工作目录,但保持旧进程(shell)的工作目录完全不变。

    【讨论】:

    • 啊,我明白你的意思了。到时候我会对fork()函数做更多的研究。
    【解决方案2】:

    使用fork 创建一个新进程,然后调用exec

    【讨论】:

    • 好的,所以创建我的 shell 的一个新实例或者只是一个使用 fork 的简单程序,然后在该过程中调用 exec 函数?如果是这样,我不敢相信我没有想到这一点!谢谢。
    • 你先 fork,然后使用 exec 调用你想要的命令。请注意,这不适用于cd
    • 好的,谢谢,我会再得到一些建议,然后测试每个方法。
    【解决方案3】:

    使用这样的东西:

    if (fork ()==0) {
        execl ("/bin/sh",NULL);
    }
    

    这将创建新进程(已运行进程的精确副本),然后用新进程替换它。 请注意,在某些 CPU 不完全支持虚拟内存并且您的原始进程太大以至于无法复制它的环境中,这可能需要一些解决方法。

    【讨论】:

    • 这会将新进程的输出(在您的情况下为/bin/sh)打印到 STDOUT 吗?
    • 是的,新运行的进程(即STDOUT和STDIN)的控制台会和原来的进程一样。
    • 好吧,它似乎有点工作。调用该函数时出现此错误。通过 exec 系统调用传递了 NULL argv[0]。这是从execl() 函数调用ls 命令...
    猜你喜欢
    • 2012-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    相关资源
    最近更新 更多