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

标签 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 输入相同的行上打印文件。

最佳答案

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

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");
}

关于C shell 程序中从 system() 更改为 execvp(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11509664/

相关文章:

python - 有没有办法在 Python 中编写脚本来更改 Linux 中的用户密码?如果是这样,如何?

c - 有没有办法查询串口可用的数据量?

linux - 如何在 Linux 中限制用户命令

linux - 如何简化匹配 IP 地址的 if-else 语句

mysql - Load infile 语句抛出错误

c++ - C vs C++ 在 VS2015 中使用 cl 编译器

c - 为什么 printf("%.6g, <value>) 忽略小数点后的零?

c++ - 如何声明和分配指针

ios - Swift 不能使用函数指针吗?

linux - 是否可以获取在父终端中运行的最后一个命令?