在C shell程序中从system()更改为execvp()

时间:2012-07-16 17:44:58

标签: c linux shell

我正在用C编写一个简单的shell。用户输入命令并将它们存储在二维数组中,例如:

SHELL$ ls ; date ; ls
// This is parsed into the following
char* commands[1000] = {"ls", "date", "ls"};

我有一个for循环,它将数组的每个元素传递给系统,如果在整个程序中我没有特定的输入角色 - 我没有ls和date的特定角色:

if (did_not_process == 0)
    system(commands[i]);

现在我想将system()转换为execvp()并具有完全相同的功能。这是我的方法无法正常运作:

if (did_not_process == 0) {        
    command[0] = commands[i];
    command[1] = NULL;

    if (fork() == 0) {
        execvp(command[0], command);
    } else {
        wait(NULL); //wait for child to complete?
    }
}

唯一的问题是当我经历shell的进一步迭代(一个简单的while循环)时,它会偶尔和不受控制地打印执行。问题出在我所展示的代码中,但我无法弄清楚在哪里。

以下是示例输出:

SHELL$ ls;date;ls
file
Mon Jul 16 13:42:13 EDT 2012
file
SHELL$ ls
SHELL$ file

第一次工作,然后在shell输入的同一行打印文件。

1 个答案:

答案 0 :(得分:3)

根据一般原则,您应该检查系统调用的返回值是否有错误:

int cpid = fork()
if (cpid == -1) {
    perror("fork");
} else if (cpid == 0) {
    execvp(command[0], command);
    perror("execvp");
    _exit(1);
} else {
    if (waitpid(cpid, 0, 0) < 0)
        perror("waitpid");
}