2015-04-10 3 views
0

Привет, я пытаюсь создать оболочку с использованием execv и fork, но у меня возникли проблемы с функциями, которые я создал. В значительной степени программа должна работать как оболочка, позволяя простые команды на переднем плане и в фоновом режиме. Итак, теперь я исправил большинство упомянутых ошибок, и теперь я остаюсь с двумя ошибками на ptr [args] = NULL; где он говорит, что присваивание делает целое число из указателя без приведения, а вторая ошибка - strcat, где он говорит недопустимый тип аргумента «unary *» (имеет «int»). Пожалуйста, помогите, я не знаю, как их исправить.Создание ложной оболочки UNIX

int argCount(char *numofArgs){ 
     int count = 0, index = 0; 

     for(count; numofArgs[index] != '\0'; index++){ 
       if(numofArgs[index] == ' ' || (numofArgs[index] == ' ' && numofArgs[index+1] == ' ')){ 
         count++; 
       } 
     } 
     count++; 
} 

void parse(char *str, int numOfArgs, char* args){ 
     char *token1; 
     const char s[1] = " "; 
     //gets first token 
     token1 = strtok(str, s); 
     while(token1 != NULL){ 
       token1 = strtok(NULL, s); 
     } 
} 

int main(int argc, char **argv[]){ 
     //holds commands 
     char hcomm[512]; 
     char *path = "/bin", *ptrarr; 
     char dummy[512]; 
     int args, exe; 
     while(1){ 
       printf("dummy&gt"); 
       fgets(hcomm, 512, stdin); 
       int pid = fork(); 
         if(pid != 0){ 
           wait(NULL); 
         } 
         else{ 
           //child if pid = 0 
           //args = counts number of args 
           args = argCount(hcomm); 
           //array of pointers for args to passed into 
           ptrarr[args + 1]; 

           //need to parse the input and arguments 
           parse(hcomm, args, ptrarr); 
           //set last pointer to NULL 
           ptrarr[args] = NULL; 
           strcpy(dummy, path); 
           //concat dummy to /bin/ 
           strcat(dummy, *ptrarr[0]); 
           //pass to exe 
           exe = execv(dummy, ptrarr); 
         } 
     } 
     return 0; 
} 
+0

"Bash" является большим (почти) надмножеством POSIX ш. Это не пытается быть bash. Он даже не пытается быть POSIX sh. Он даже не пытается стать борзой 1970-х годов. Пожалуйста, не помещайте что-либо «bash», если оно не связано с bash; лучший тег для этого будет просто «оболочкой», поскольку это вопрос оболочки. –

+0

Также, как правило, для сообщения _any_ в StackOverflow, попробуйте уменьшить до наименьшего возможного фрагмента кода, который будет воспроизводить заданную проблему перед публикацией. См. Также http://stackoverflow.com/help/mcve –

+0

Неплохо, я довольно новичок в Stack, поэтому я все еще привыкаю к ​​этому. Спасибо за ваш вклад. – MoistyTacos

ответ

1

Существует множество предупреждений и ошибок, и я не совсем обращаюсь к ним всем. Это потому, что даже одна ошибка иллюстрирует глубокое непонимание того, что происходит. Так что я буду просто говорить о первом предупреждении:

dummyshell.c: 10: предупреждение: проходя аргумент 1 из «» STRCMP делает указатель из целого

Я полагаю, это относится к:

strcmp(numofArgs[index], " ") = 0 

Прежде всего, strcmp ожидает строку. Под этим я имею в виду указатель на массив символов. Вы передаете его numofArgs[index] заставляет его рассматривать это значение как указатель. Затем он попытается обработать строку, на которую указывает этот указатель. Я очень сомневаюсь, что этот адрес памяти фактически содержит строку. Например, если numofArgs[index] содержит символ 'A', он преобразуется в адрес памяти 0x00000041 (поскольку значение ASCII 'A' равно 0x41). Если по совпадению этот адрес содержит строку, вы в безопасности. Но даже тогда я не думаю, что он будет делать то, что, по вашему мнению, должен делать.

Во-вторых, strcmp обрабатывает строку, пока не найдет терминатор NUL (0x00). Таким образом, если символ 'A' с входа указывает на область памяти, которая оказывается пространственным символом, она может по-прежнему не правильно сравнивать с символом пробела, который вы предоставляете. Например, введите входной символ: A. Как обсуждалось, это означает, что вы передаете строку, расположенную в диапазоне от 0x00000041 до strcmp. Скажем, например, что строка в этом месте - " ok" (пробел, o, k). В этой ситуации strcmp все равно не вернет 0, потому что он сравнивает " ok" с " ".

Вкратце, strcmp предназначено для сравнения строк (NUL завершен массив символов). Это не для сравнения персонажей.

То, что вы, вероятно, имел в виду, а не так:

if(numofArgs[index] == ' ' || (numofArgs[index] == ' ' && numofArgs[index+1] == ' ')){ 
    count++; 
} 

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

+0

Хорошо, спасибо. Я на самом деле был похож на предыдущий, но я изменил его на strcmp(), который, как я знаю, теперь ошибается. – MoistyTacos

0
  • Не используйте оператор присваивания = вместо теста равенства ==.

  • Вы объявляете несколько переменных() как const char* или char*. Это нормально, если вы хотите, чтобы каждый из них указывал на одну строку. Если вы хотите иметь массив строк (и, похоже, это то, что вы имели в виду), используйте что-то вроде const char*[32] (при инициализации) или const char** (в списке параметров).

  • Некоторые из ваших утверждений не делать ничего: ptrarr[args + 1];

+0

Я думаю, что я исправил большинство вещей, которые вы упомянули. Благодаря! – MoistyTacos

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