2016-10-30 2 views
-1
#include <stdio.h> 
#include <sys/types.h> 
#include <sys/wait.h> 
#include <unistd.h> 
#include <stdlib.h> 
#include <string.h> 

void main(){ 
char *cmd; 
pid_t pid; 
while (1) { 
printf("$ "); 
fgets(cmd,1000,stdin); 
if (pid = fork() == -1) { 
exit(1); 
} 
else if (pid == 0){ 
execvp(cmd,&cmd); 
} 
else{ 
int status; 
wait(&status); 
} 
} 
} 

Я делаю простую оболочку, которая выполняет команды, но когда я ввожу команду в подсказке, я продолжаю получать ошибку сегментации. Это самая простая версия, которая работает только для команд, один-аргумент, как «LS»Ошибка сегментации с использованием execvp в c shell

+0

Добро пожаловать в переполнение стека! Похоже, вам, возможно, потребуется научиться использовать отладчик для выполнения вашего кода. С хорошим отладчиком вы можете выполнить свою программу по очереди и посмотреть, где она отклоняется от ожидаемого. Это важный инструмент, если вы собираетесь заниматься программированием. Дальнейшее чтение: [Как отлаживать небольшие программы] (http://ericlippert.com/2014/03/05/how-to-debug-small-prgrams/). –

+1

Что заставило вас принять решение читать максимум в 1000 '' char's? – alk

+1

Этот 'pid = fork() == -1' не делает то, что вы его предполагаете (подробности см. Здесь: http://en.cppreference.com/w/c/language/operator_precedence). – alk

ответ

2

Для Вашего проблемы, в вашем коде,

fgets(cmd,1000,stdin); 

cmd не инициализирован. Он не указывает на действительную память. Доступ к недопустимой памяти вызывает undefined behavior.

Вам необходимо выделить память cmd, прежде чем использовать ее. Кроме того, вы можете рассмотреть вопрос о создании массива cmd, например char cmd[1000] = {0};, чтобы избежать необходимости выделять память самостоятельно.

Тогда execvp(cmd,&cmd); не совсем прав, это не то, что вы думаете. Прочтите man page для лучшего понимания.

Это означает, что для размещаемой среды void main() должен по крайней мере быть int main(void) иметь стандартное соответствие.

+0

, но у меня есть 'char * cmd;', который инициализирует указатель, если я вижу это правильно. –

+0

@JimmySamoladas хорошо, что определяет 'cmd', не инициализирует это, не говоря уже о _valid_. –

+0

Я пробовал массив символов раньше, но я получаю ошибки в аргументах execvp, которые запрашивают 'const char *', и я даю 'const char * [1000]' –