2014-10-05 2 views
-1

Я пытаюсь реализовать базовую оболочку в c. Но я столкнулся с проблемой, когда я печатаю содержимое массива char, и он выводит только первую команду того, что я набираю. Так, например, если бы я набрал «ls -l», он бы распечатал только «ls». Однако это смущает меня с тех пор, как я набираю ls -l, когда я запускаю оболочку, он выполняет правильную команду и показывает разрешения для каждого файла. Теперь, когда я делаю «rm -f/path/to/file», он не удаляет его. Также, если я делаю «cd/path», он действует так, как будто он не видит второй аргумент (путь). Я не могу понять, что происходит. Любое понимание?ошибки в реализации оболочки в C

while (1) { 
      /* Print the command prompt */ 
      printf("prompt> "); 
      fgets(input, 1024, stdin); 

      // get first token 
      args[i++] = strtok(input, " \n"); 

      while((args[i++] = strtok(NULL, " \n")) != NULL); 
      args[i] = NULL; 

      printf("%s\n", *args); 



     if(strcmp(*args, "exit") == 0) 
      exit(1); 

     else{ 
      int pid = fork(); 
      if(pid == 0){ 
       execvp(args[0], args); 

    else waitpid(pid, NULL, 0); 


     } 
     return 0; 
    } 
+1

Это задание или вы пытаетесь построить настоящую оболочку? Во втором случае вы должны действительно узнать о генераторах синтаксического анализатора и избегать парсинга с ручным кодированием, если у вас нет веских оснований для этого. Это болезненная и подверженная ошибкам задача, как показывают недавние эпизоды. –

+1

Почему вы ожидаете одного вызова 'printf ("% s \ n ", * args)' для печати нескольких строк? –

+0

, вероятно, 'algol 68' более популярен, чем' C', когда речь идет о оболочках и средах командной строки в целом, 'C' не так популярен среди этого семейства программного обеспечения. Реализация полезной, а не тривиальной оболочки, должна быть долгой болезненной задачей для очень небольшого выигрыша. – user2485710

ответ

0
args[i++] = strtok(input, " \n"); 

     while((args[i++] = strtok(NULL, " \n")) != NULL); 
     args[i] = NULL; 

арг инициализируется в начале программы, так как это программная оболочка (не предполагая аргумента передаются при выполнении этой программы) только Exec называется передаются в начале программы так ARGC = 1 и args [0] = «ваше имя исполняемого файла» .args и argc хранятся в стеке до запуска программы. Итак, когда вы делаете args [i ++], это незаконная операция, удивляйтесь, почему программа не была прервана. Попробуйте проанализировать аргументы/токены в предварительно выделенном или динамическом буфере.

Смежные вопросы