c-我正在尝试编写一个shell程序,以便一次执行多个命令



我的代码

#include<stdio.h> 
#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h>
int main() 
{ 
char * arg_list[3];
arg_list[0] = "ls";
arg_list[1] = "-l";
arg_list[2] = 0;
char *arg_list2[3];
arg_list2[0] = " ps";
arg_list2[1] = "-ef";
arg_list2[2] = 0;
for(int i=0;i<5;i++){ // loop will run n times (n=5) 
if(fork() == 0) { 
if (i == 0){
execvp("ls", arg_list);
}else if(i==1){
execvp("ps" , arg_list2);
}else if(i>1){
printf("[son] pid %d from [parent] pid %dn",getpid(),getppid()); 
exit(0); 
}
} 
} 
for(int i=0;i<5;i++) // loop will run n times (n=5) 
wait(NULL); 
} 

ME试图修改它

#include<stdio.h> 
#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h>
int main() 
{ 
for(int i=0;i<5;i++){ // loop will run n times (n=5) 
if(fork() == 0) { 
printf("[son] pid %d from [parent] pid %dn",getpid(),getppid()); 
execlp(argv[i],argv[i],argv[i+1],(char*)NULL);
exit(0); 
} 
} 
for(int i=0;i<5;i++) // loop will run n times (n=5) 
wait(NULL); 
} 

--需要指导和理解

我正在尝试制作我自己的小型shell程序。当我运行我的第一个代码工作正常时,在命令行上运行所有命令。但我无法知道并定义用户可能输入的所有命令。所以我正在尝试获得一个基本代码,它可以运行用户单个或多个输入的任何命令。我试着使用execlp,它不编译,说argv没有定义,这是真的,因为我不想具体定义它。

我正在尝试制作自己的小型shell程序。当我运行我的第一个代码工作正常时,在命令行上运行所有命令。但我无法知道并定义用户可能输入的所有命令。

当然。。。。shell程序的目的基本上是:

  1. 读取用户输入
  2. 执行用户输入
  3. 返回执行结果

您的代码中没有读取用户输入的内容。。。。

所以我正在尝试获得一个基本代码,它可以运行用户单个或多个输入的任何命令。

因此读取用户输入;-(

我尝试使用execlp,它不编译,说argv没有定义,这是真的,因为我不想具体定义它。

当然。。。但是GCC怎么会猜到`argv[]É必须自动填充用户输入呢?用C语言编码时没有任何自动功能。您必须手动管理。

此外,请注意,argcargvenvp通常保留给main()函数:

main(int argc, char **argv, char **envp)

因此,您可以使用其他方法来构建命令数组。

在伪代码中,您必须实现的是:

quit=0
while (quit = 0) {
command_to_run = read_user_input();
if (command_to_run == "exit") {
quit = 1;
} else {
execute(command_to_run);
}
}

一些建议:

  • 尝试使用更多的函数。例如,实现一个fork_and_run(char **cmd)函数来fork,然后执行用户提供的命令。Il将使您的代码更可读,更易于维护。

  • 仔细阅读手册页:您应该知道的一切(例如,提供给execvp()的数组必须以NULL结尾(都写在其中

  • 您的调试消息应该打印到stderr。命令运行的结果必须打印到stdin,因此使用fprintf()而不是printf()来写入正确的流。

  • 我会使用#define debug(x) fprintf(stderr, x)或类似的东西来调试输出,这样以后就可以很容易地禁用;-(

最新更新