我正在编写一个简单的C shell。用户input命令,它们存储在一个二维数组中,例如:
SHELL$ ls ; date ; ls // This is parsed into the following char* commands[1000] = {"ls", "date", "ls"};
我有一个循环,将数组的每个元素传递给系统,如果在我的程序中,我没有特定的angular色input – 我没有具体的angular色ls和date:
if (did_not_process == 0) system(commands[i]);
现在我想要将system()转换为execvp()并且具有相同的EXACTfunction。 这是我的方法,没有适当的function:
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
第一次运行,然后在shellinput的同一行打印文件。
就一般原则而言,您应该检查系统调用的错误返回值:
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"); }