Это может показаться глупым, но я использую libaio (не posix aio), я могу что-то записать в файл, но я также записываю в файл дополнительные данные.
Я читал о требованиях к выравниванию и типе данных поля буфера iocb.
Вот пример кода (только соответствующие разделы использования для представления)
aio_context_t someContext;
struct iocb somecb;
struct io_event someevents[1];
struct iocb *somecbs[1];
somefd = open("/tmp/someFile", O_RDWR | O_CREAT);
char someBuffer[4096];
... // error checks
someContext = 0; // this is necessary
io_setup(32, &someContext ); // no error checks pasted here
strcpy(someBuffer, "hello stack overflow");
memset(&somecb, 0, sizeof(somecb));
somecb.aio_fildes = somefd ;
somecb.aio_lio_opcode = IOCB_CMD_PWRITE;
somecb.aio_buf = (uint64_t)someBuffer;
somecb.aio_offset = 0;
somecb.aio_nbytes = 100; // // //
// I am avoiding the memeaign and sysconf get page part in sample paste
somecbs[0] = &somecb; // address of the solid struct, avoiding heap
// avoiding error checks for this sample listing
io_submit(someContext, 1, somecbs);
// not checking for events count or errors
io_getevents(someContext, 1, 1, someevents, NULL);
Вывод:
Этот код создает файл и записывает предполагаемое переполнение стека строки приветствия в файл /tmp/someFile.
Проблема:
Файл /tmp/someFile также содержит после предполагаемой строки последовательно @^@^@^@^@^@^@^@^@^ и некоторые разделы из самого файла ( раздел кода) em>, можно сказать фигня.
Я в какой-то степени уверен, что это неправильный указатель в поле данных, но не могу это взломать.
- Как использовать aio (не posix), чтобы точно и только «привет мир» записать в файл?
Я знаю, что на данный момент вызовы aio могут поддерживаться не во всех файловых системах. Тот, против кого я выступаю, поддерживает.
Изменить. Если вам нужен стартовый пакет для этой попытки, вы можете получить его здесь.
http://www.fsl.cs.sunysb.edu/%7Evass/linux-aio.txt
Редактировать 2: Небрежность, я устанавливал большее количество байтов для записи в файле, и код учитывал это. Проще говоря, чтобы написать ровно 'hw', требовалось не более 2 байтов в поле байтов iocb.
/tmp/someFile
равен 100, верно? - person alk   schedule 17.08.2017somecb.aio_nbytes = 100;
, что, как я полагаю, является вашим окончательным размером файла. Вероятно, вы пишете за пределами инициализированной части вашего буфера. Вы, вероятно, захотите использовать фактическую длину строки при записи. - person Hasturkun   schedule 17.08.2017somecb.aio_buf = (uint64_t)someBuffer;
: Я не вижу здесь необходимости в гипсе. 2)struct iocb *somecbs[1];
Вам это не нужно. 3) вы предполагаете нулевые/нулевые заполненные буферы. - person wildplasser   schedule 18.08.2017