C: dup2 () перед выполнением - PullRequest
0 голосов
/ 11 марта 2011

Для выполнения домашнего задания я должен написать базовую оболочку, включая перенаправление. Программа использует readline для запроса ввода, анализирует входную строку и разбивает ее на имя исполняемого файла, аргументы и файл (ы) ввода / вывода, если это применимо. После разбора строки он и дочерние execv () переходят в исполняемый файл, который был передан. Я использую dup2 () для изменения файловых дескрипторов после разветвления и перед execv, но у меня возникла проблема, как только Программа имеет execv'd для нового исполняемого файла. Если в моей оболочке я запускаю ls > foo.out, я получаю: ls: cannot access H��y�A� $ L��H)�I��$�: No such file or directory

Построение c-> argv:

char *args[6];

int i;
for(i=0;i<=4;i++){
    char *_arg=strsep(&_str_cmd," ");
    printf("Found _arg: %s\n",_arg);

    // If there is an argument and it is not blank
    if(_arg && strcmp(_arg,"")!=0){
        if(strcmp(_arg,"<")==0){
            _cmd.infile=strsep(&_str_cmd," ");
            i--;
            continue;
        }
        else if(strcmp(_arg,">")==0){
            _cmd.outfile=strsep(&_str_cmd," ");
            i--;
            continue;
        }
    }
    else{break;}
}
args[i]=(char*)0;

_cmd.binary=args[0];
memcpy(_cmd.argv,args,sizeof _cmd.argv);

1 Ответ

2 голосов
/ 11 марта 2011

Как вы строите c->argv?Это должен быть NULL -определенный массив char *.Вероятно, вам не хватает терминатора.


При обработке кода <... и >... вы пропускаете запись в argv, оставляя ее неинициализированной.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...