使用execvp()执行shell命令

4

我希望编写一个像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(或类似的执行同样功能的函数)?


"...使我的程序响应任何命令..." 在父进程中,您拥有 fd[1] 文件描述符,可以使用它来在已建立的 pipe() 上写入某些内容。请注意,您列出的命令不需要任何输入交互。 - πάντα ῥεῖ
2个回答

3
一个shell基本上会执行以下操作:
  1. 从stdin读取一行
  2. 解析该行以制作单词列表
  3. 分叉
  4. 然后shell(父进程)等待子进程的结束,而子进程执行由从输入行中提取的单词列表表示的命令代码。
  5. 然后shell重新从步骤1开始。

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


1
如果我正确理解了问题,您可以:
  • 使用 scanf() 读取字符串数组
  • 使用 execvp() 将其作为命令运行(它与 execlp() 的工作方式相同,但您可以将所有参数作为数组传递)。

类似于:

char args[100][50];
int nargs = 0;
while( scanf( " %s ", args[nargs] ) )
   nargs++;
args[nargs] = NULL;
/* fork here *
...
/* child process */
execvp( args[0], args );

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接