2015-06-09 5 views
0

Я пытаюсь контролировать файл, который я создаю, когда содержимое изменяется с 0 на 1. Этот код создает файл и отображает его в порядке, затем я вращаюсь, ожидая, пока содержимое *map изменится с '0' на '1'.Можно ли записать в файл mmap'd без получения ошибки шины

Однако, как только я запустил echo 1 > file.dat, код выходит из строя с помощью Bus Error.

Я предполагаю, что это потому, что новый файл создается с помощью эха (или чего-то еще, что я пытаюсь), и mmap больше не указывает на что-то важное. Есть ли способ сделать эту работу?

int fd = open(filename.c_str(), O_RDWR | O_CREAT | O_TRUNC, (mode_t)0600); 

write(fd, "0", 1) 

char* map = static_cast<char*>(mmap(0, 1, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0)); 
+2

@MichaWiedenmann: lol "эмоциональный" ?? –

+1

Ну, я думаю, это отражается на потраченных усилиях. –

+0

Не могли бы вы, по крайней мере, установить образец, например. [coliru] (http://coliru.stacked-crooked.com/), который воспроизводит проблему. –

ответ

3

echo 1 > the_file делает следующее:

  1. Округление the_file до 0 байт.
  2. Append символы, 1 и \n к the_file

В промежутках между шагами 1 и 2, файл имеет длину 0.

(Шаг 1 выполняется оболочкой, когда она интерпретирует перенаправление >the_file. Шаг 2 затем выполняется командой echo, поэтому между ними может быть значительное количество времени.)

Если вы хотите переписать один символ файла, вы можете использовать dd:

echo 1 | dd of=the_file bs=1 count=1 conv=notrunc 
+0

Ну, вопрос, похоже, не специфичен для Linux, или не так ли? –

+0

@ πάνταῥεῖ: Нет, он будет таким же в любой системе posix. Зачем? – rici

+0

Поскольку 'dd' недоступен в каждой совместимой с posix системе. –