2015-04-17 2 views
0

Я использую linux, и я хочу написать программу в c, которая читает команды от пользователя до тех пор, пока я не войду в стоп. Для каждой команды основная программа создаст процесс A, который создаст другой процесс B. процесс B выполнит команду, введенную пользователем. Я хочу заставить его работать с помощью exec, но он работает только для команд с одним словом (например: pwd, ls), если я вхожу, например, ls -l, он говорит, что такого файла или каталога нет Код, который я написал до сих пор:use exec in c program

#include <sys/types.h> 
#include <sys/stat.h> 
#include <sys/wait.h> 
#include <fcntl.h> 
#include <stdlib.h> 
#include <stdio.h> 
#include <unistd.h> 
#include <string.h> 

#define N 100 

int main() { 
    char input[N]; 
    scanf(" %[^\n]s",input); //reads from user inputs that can include space 
    while (strcmp(input,"stop") != 0) { // verifies if entered command == stop 
     int a; 
     a = fork();//creates the process A 
     if (a == -1) { 
      perror("fork imposibil!"); 
      exit(1); 
     } 
     if (a == 0) { 
      printf("a\n");//i printed that to verify if my fork works 
      int b; 

      b = fork();//creates process B 
      if (b == -1) { 
       perror("fork imposibil!"); 
       exit(1); 
      } 
      if (b == 0) { // the part that makes me problems , i try to use exec to execute the command that is stored in input 
       printf("b\n"); 
       if (execlp(input,"",(char*) 0) < 0) { 
        perror("Error exec"); 
        exit(0); 
       } 
       exit(0); 
      } 
      wait(0); 
      exit(0); 
     } 
     wait(0); 

     scanf(" %[^\n]s",input); 
    } 
    return 0; 
} 

Может кто-нибудь помочь мне, пожалуйста? P.S. Я не думаю, что мой код был настолько невозможным для чтения, но я надеюсь, что сейчас лучше.

+0

Прежде всего научиться писать читаемый код, а затем вы можете задать вопрос, потому что чтение кода, как это было, почти невозможное.Например, я не видел 'exit()' after' perror() ', не видел его вообще, и я подумал:« К сожалению, он сообщает об ошибках, но все равно игнорирует их. И я думаю, вы должны вызывать '_exit (0)' вместо 'exit (0)' из дочернего процесса. –

ответ

2

Из вашего примера ls -l, -l должен быть передан аргументу.

int execlp(const char *file, const char *arg, ...); 

цитата из help говорит

Функцию можно рассматривать как arg0, arg1, ..., АГРН. Вместе они описывают список одного или нескольких указателей на строки с нулевым завершением , которые представляют список аргументов, доступных исполняемой программе. Первый аргумент, по соглашению, должен указывать на имя файла , связанное с исполняемым файлом. Список аргументов должен быть , заканчивающийся указателем NULL, и, поскольку это переменные функции, этот указатель должен быть отличен (char *) NULL.

0

Вы не передаете аргументы функции execlp() так, как она ожидает их.

Начальный аргумент для этих функций - это имя файла, который должен быть выполнен .

Состояния const char * arg и последующие эллипсы в функциях execl(), execlp(), и execle() можно рассматривать как arg0, arg1, ..., argn. Вместе они описывают список одного или нескольких указателей на строки с нулевым символом, которые представляют список аргументов, доступных для выполненной программы. Первый аргумент, по соглашению, должен указывать на имя файла, связанное с исполняемым файлом. Список аргументов должен быть прерван указателем NULL, и поскольку это переменные функции , этот указатель должен быть отличен (char *) NULL.

Посмотрите на этом объяснении о том, как использовать() функции имеют функции- I do not understand how execlp() works in Linux

Я думаю, вам придется использовать функцию строки разделителя с разделителем " ", чтобы получить аргументы командной строки, как -l в вашем случае ls -l.

strtok() обеспечивает эту функциональность в C.

#include <string.h> 
#include <stdio.h> 

int main(void) 
{ 
    char input[] = "A bird came down the walk"; 
    printf("Parsing the input string '%s'\n", input); 
    char *token = strtok(input, " "); 
    while(token) { 
     puts(token); 
     token = strtok(NULL, " "); 
    } 

    printf("Contents of the input string now: '"); 
    for(size_t n = 0; n < sizeof input; ++n) 
     input[n] ? printf("%c", input[n]) : printf("\\0"); 
    puts("'"); 
}