c++ - 使用 execvp() 执行 shell 命令

标签 c++ linux shell command

我想编写一个类似于 Linux shell 的程序。我开始编写一个小程序来执行“ls”命令。我想不通的是我应该如何进行才能让我的程序像 shell 一样响应任何命令。 (例如 cat、cd、dir)。

#include <iostream>
#include <unistd.h>
#include <sys/types.h>
#include <stdlib.h>
#define MAX 32
using namespace std;

int main() {
    pid_t c; 
    char s[MAX];
    int fd[2];
    int n;

    pipe(fd);
    c = fork();

    if(c == 0) {
        close(fd[0]);
        dup2(fd[1], 1);
        execlp("ls", "ls", "-l", NULL);
        return 0;
    } else {
        close(fd[1]);
        while( (n = read(fd[0], s, MAX-1)) > 0 ) {
            s[n] = '\0';
            cout<<s;
        }
        close(fd[0]);
        return 0;
    }

    return 0;
}

如何让我的程序读取用户输入的内容并将其传递给 execlp(或执行相同操作的类似程序)?

最佳答案

shell 基本上做以下事情:

  1. 从标准输入读取一行
  2. 解析该行以生成单词列表
  3. fork
  4. 然后 shell(父进程)等待子进程结束,而子进程执行从输入行中提取的单词列表表示的命令代码。
  5. 然后 shell 在第 1 步重新启动。

首先构建一个非常简单的 shell 。

关于c++ - 使用 execvp() 执行 shell 命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27491669/

相关文章:

linux - aplay 在 systemd 运行时不播放音频

linux - 使用 crontab 运行带参数的脚本

C++如何测试函数使其抛出错误?

c++ - 使用带有 PIR 传感器的毫秒检测连续运动

c++ - 多个应用程序拷贝访问 SQLite 文件?

c - Hook 在终端上。我可以在终端中运行命令之前调用方法吗?

linux - 如何在 Linux 中获取文件夹中的第二个最新文件

c++ - 对模板类链使用可变参数模板来生成序列化

linux - Oracle Linux,在 macOS 上的 VirtualBox 中运行时防止网络适配器休眠

linux - 在 Sed 中的匹配项之间添加一个空格