Ошибка записи (неправильный дескриптор файла) при попытке записи

Я пытаюсь записать вывод команды Linux bash в файл, имя которого указано массивом строк.

if(isRedirection==1){
    fd = open(args[2], S_IRUSR|S_IWUSR);
    dup2 (fd, 1);
    /* El descriptor 1, de la salida estándar, pasa a ser un duplicado de fd */
    write(  fd, "hola" , 50  );
    close (fd);
}

execvp(args[0],args);

isRedirection возвращает 1, когда массив имеет тип ls > salida.txt, где «output.txt» - это файл, который должен открыть и записать в него выходные данные команды ls, что, как я понимаю, равен 1 (дескриптор файла).

Команда write является только тестом, но непосредственно программа завершается с open. Что это может быть?

Параметры :

  • args[0] будут ls

  • args[1] Я заменяю его на NULL в методе, предоставленном мне isRedirection

  • args[2] будет salida.txt

1
задан 19.12.2016, 11:21
2 ответа

Перенаправление захватывает тебе shell, так что в программе, что ты пишешь argv [1], и argv [2] они не существуют. Я хочу сказать, выполнимые ты ли он test и ты выполняешь ./test > salida.txt shell выполнит ./test без аргументов и вывода этой команды он перешлет ее в файл salida.txt

Ты можешь убегать перенаправление выполняя ./test \> salida.txt

Относительно кода, кажется, что ты оставил себе opening flags во втором аргументе open.

Следующий фрагмент fd = open(args[2], S_IRUSR|S_IWUSR); он был бы должен оставаться немного как fd = open(argv[2], O_CREAT | O_RDWR | O_APPEND, S_IRUSR | S_IWUSR); для того, чтобы он создал файл, если он не существует, откройте это для чтения и написания и писца в конце файла всегда.

Я надеюсь помочь.

1
ответ дан 24.11.2019, 12:02

В зернышко:

open(args[2], S_IRUSR|S_IWUSR);

Это устанавливает признаки для файла, который ты будешь создавать, но ты не показываешь, что ты хочешь создать это. Тебе не хватает аргумента:

open( args[2], O_CREAT, S_IRUSR | S_IWUSR );

Так или иначе, если open( ... ) == -1, в errno у тебя будет код ошибки, которую тебе покажет, более или менее, который является неудачей.

0
ответ дан 24.11.2019, 12:02
  • 1
    Ты имеешь razó n, мне не хватало этого аргумента, чтобы создавать файл, если он не был уже создан, но я продолжаю иметь проблемы с dub, когда я показываю ему, что описывающий файлов esté распределенный с выводом está ndar. Если я помещаю что-то из типа write (dub (fd, 1)... и оставшаяся часть аргументов) не пишет мне совсем ничего и меня отпускает ошибка описывающего ошибочного файла также. Он дает мне impresió n, которого я только что не понял это в описывающем файлов... –  Víctor Martínez Llamas 17.12.2016, 21:31
  • 2
    Ты был бы должен подтверждать возврат dup2, немного как if( dup2( ) == -1 ) fprintf( stderr, "%s", strerror( errno ) );, включая <string.h> и <stdio.h>. Он был бы очень полезным :-) –  Trauma 17.12.2016, 21:34
  • 3
    Я исправляю, dup2 он не дает ningú n ошибка (с perror (" error") прыгни success, и с условным, что ты показал мне, что ему не удается войти, так как он не возвращает.1), ошибка происходит от того, что делает execvp (args [0], args), состоя в том, что args [0] - " ls" и вытекающая ошибка es:" ls: ошибка написания: описывающий файла erroneo." –  Víctor Martínez Llamas 17.12.2016, 21:37
  • 4
    Так как я это не вижу. Если ты write( fd, "hola" ) не дает тебе ошибку, также deberí чтобы, давать тебе то, что ты выполняешь под execvp( ), сын получает в наследство stdout отца, и предполагается, что завершение fd не было бы должно затрагивать другого. Доказательство снимая close( fd ), чтобы видеть, что он происходит. –  Trauma 17.12.2016, 22:14