int main() {
char buf[2];
read((0, buf, 2);
lseek(0, 1, SEEK_CUR);
write(1, buf, 2);
}
Программа rwl, исходный код которой показан вверху, запускается с помощью следующей команды в двухстрочном текстовом файле с данными «01234» в каждой строке. Определите данные, которые будет отображать эта команда, и изменения, которые необходимо внести в исходный код rwl, чтобы команда была завершена.
$> пока rwl; делать :; готово <файлA
Это старый экзаменационный вопрос. Может ли кто-нибудь помочь мне решить эту проблему?
Я попытался поместить while(read(0, buf, 2) > 0) и поместить еще 2 внутри цикла, но это не сработало.
(возможно, вы могли бы изменить программу C так, чтобы она запускалась только exit(1);
и больше ничего не делала, и это удовлетворило бы требование выхода из цикла).
Когда код запускается, он печатает 01340134 и никогда не завершает работу. Он просто пытается продолжать чтение. Я пытаюсь заставить программу завершить работу после чтения файла.
Отлично! Убедитесь, что он вызывает exit(1)
в случае сбоя чтения. Как и почти во всех других видах обработки ошибок в C, это означает, что вам нужно обратить внимание на возвращаемые значения и errno
.
Кстати, я бы сказал, что этот код намеренно запутан, поскольку он использует постоянное целое число в качестве аргумента whence
для lseek
, а не одно из наиболее читаемых имен констант. Возможно, вы захотите посмотреть, что означает 1
в значении whence
, и заменить его соответствующим образом для облегчения понимания.
о, это значит SEEK_CUR, я только что написал 1
Что заставляет вас думать, что цикл может когда-либо завершиться?
Это проблема C, а не проблема bash: ваша программа не проверяет наличие ошибок, поэтому она никогда не обнаруживает, что ей не удалось успешно прочитать дополнительный контент из файла, и, соответственно, никогда не сообщает bash, что это не удалось - поэтому цикл никогда не выходит.
#include <unistd.h>
#include <stdlib.h>
int main() {
char buf[2];
int retval;
retval = read(0, buf, 2);
if (retval != 2) { exit(1); }
retval = lseek(0, 1, SEEK_CUR);
if (retval < 0) { exit(1); }
retval = write(1, buf, 2);
if (retval != 2) { exit(1); }
}
он никогда не обнаруживает, что не смог успешно читать и писать. О, исходный код продолжит успешно писать... 😉
@AndrewHenle, конечно, пишет NUL (которые терминал игнорирует). Однако с точки зрения системного вызова это, безусловно, успех.
Если stdout
перенаправляется на файл, он не будет проигнорирован...
Омг, это сработало, спасибо большое
Я сказал вам, что это сработает в комментариях почти час назад. Непонятно, почему вам пришлось ждать ответа.
На какой конкретный технический вопрос вам нужно ответить, чтобы иметь возможность решить его самостоятельно? Здесь есть несколько различных движущихся частей, что делает общий запрос «решить этот экзаменационный вопрос», написанный в настоящее время, не узким и конкретным, как того требуют наши правила определения области действия.