Zdravim,
narazil jsem na problem pri pouziti asynchroniho zapisu do souboru(aio_write)
Program vychazi z ukazky na
http://docs.hp.com/en/B9106-90009/aio_write.2.htmlNedela nic jineho, nez ze si nazacatku alokuje pole ukazatelu na data (ktera vyplni poradovym cislem) a pote se v cyklu vola aio_write.
Problem je v tom, ze vysleny soubor(test.bin) obsahuje jina data nez se da ocekavat:
ocekavam data
00000000000....000 (32x0)
11111111111....111(32x1)
..
..
128 128 128....128 (32x128)
ale zapisou se mi data:
0000.....0000 ( 1826 x 0 )
58 58 58 ...... (32x58)
0 0 0 0 0....0 (128x0)
78 78 78 ..... ( 32 x 78 )
...
..
..
Cislo 58 je spravne, ale pred nim by melo byt 32x1 .... 32x57
Ciso 78 tez sedi opet ale mezi nim a 58 jsou zahadne 0
#include <fcntl.h>
#include <errno.h>
#include <aio.h>
typedef BYTE unsigned char;
int main()
{
const int a_size = 128;
const int i_size = 32;
BYTE ** buffers = new BYTE* [a_size];
int j = 0l
for( j = 0; j < a_size; j++ )
{
buffers[j] = new BYTE[i_size];
memset( buffers[j], j, i_size ); //pro kontrolu nastavim kazdy buffer na rozlicny obsah
}
int retval;
ssize_t nbytes;
struct aiocb myaiocb;
memset( &myaiocb,0, sizeof (aiocb));
/* nastaveni pevny parametru ktere nebudu menit */
myaiocb.aio_fildes = open( "test.bin", O_RDWR|O_CREAT);
myaiocb.aio_nbytes = i_size;
myaiocb.aio_sigevent.sigev_notify = SIGEV_NONE;
for( j = 0; j < a_size; j++ )
{
myaiocb.aio_buf = (void *) buffers[j];
retval = aio_write( &myaiocb );
myaiocb.aio_offset += i_size; //chci zapsat dal, tak se posunu o to co jsem zapsal
if (retval) perror("aio_write:");
}
printf("waiting\n");
while ( (retval = aio_error( &myaiocb) ) == EINPROGRESS) ;
nbytes = aio_return( &myaiocb);
/*
dealokace pameti ...
*/
return 0;
}
Kdyby nekoho napadly duvody proc zapisu jina data nez mam v umyslu, diky.
(vysledny "spatny" soubor je k prohlednuti na
http://mizici.com/test.bin)