【问题标题】:writing a program to act like command line in C在 C 中编写一个类似于命令行的程序
【发布时间】:2015-09-16 10:47:02
【问题描述】:

所以根据我自己的发现,我知道我将需要使用fork()execvp(),但我无法从任何在线示例中完全弄清楚如何正确使用execvp()。它应该让我基本上运行命令行的东西,但我不明白它需要的参数。就像我想运行ls -a 一样,我将如何将其放入execvp()?然后是exec() 不返回的问题。我该如何处理?

【问题讨论】:

    标签: c unix


    【解决方案1】:

    首先,exec() 不会返回,因为它会导致进程将它执行的程序替换为 exec()ed 的任何程序。也就是说,如果您在fork() 之后通过exec() 运行ls,则ls 的PID 将与调用exec() 的PID 相同。那就是exec() 不会创建一个新进程,所以它不能返回,因为调用它的程序中的所有内存和代码实际上都已经消失了,取而代之的是exec()ed

    运行ls -aexecvp() 假设ls/bin

    const char *file = "/bin/ls";
    const char *arg1 = "ls";
    const char *arg2 = "-a";
    const char **argv = {arg1, arg2, NULL};
    execvp(file, argv);
    

    【讨论】:

    • 注意:execvp()的返回值应该从main()返回。
    • @chux 什么?您是在谈论我没有包含任何错误处理的事实吗?除非execvp() 失败,否则它根本不会返回,仅此而已。无论我们如何处理返回值,父进程都将能够获取exec()d 程序的退出值,因为如果成功则不会返回。明智的错误处理我们可以做任何我们想做的事情并返回我们选择的任何退出代码。或者我们可以使用某种 IPC 来告诉我们的父母我们失败了,不管怎样。
    • 很好的答案,但是,I 会 fork(),如果是 child,则调用 execvp()。然后父进程可以调用 waitpid() 以便在子进程退出后恢复运行。此外,想要解析用户输入的输入,而不是对单个“ls”命令进行硬编码
    • @user3629249 我只是在展示execvp() 的工作原理,而不是试图解决整个问题,因为这正是问题所在。
    • @Spudd86 所以*file 将永远是“/bin/”?为什么将NULL 添加到argv?其余的我想我明白了
    猜你喜欢
    • 2013-12-19
    • 1970-01-01
    • 1970-01-01
    • 2017-09-12
    • 2011-02-03
    • 1970-01-01
    • 2021-01-11
    • 2012-04-24
    • 1970-01-01
    相关资源
    最近更新 更多