vendredi 8 mai 2015

memset fill file with 'a'

Almost two hours I'm having problems with my program. I'm trying to fill my file with character 'a'but my program doesn't work. Here's my write function

int da_aio_write(const int d, struct aiocb *aiorp, void *buf, const int count){
   int rv = 0;

   memset( (void *)aiorp, 'a', sizeof( struct aiocb ) );
   aiorp->aio_fildes = d;
   aiorp->aio_buf = buf;
   aiorp->aio_nbytes = count;
   aiorp->aio_offset = 0;
   rv = aio_write( aiorp );

   if( rv == -1) {
       perror("ERROR!!!\n"); // my program print this (Invalid argument)
       exit(1);
       return rv;
   }
   return rv;
}

somehow rv fail (rv == -1) and I don't get expected results. Alsko I add my full program

#include <stdio.h>
#include <stdlib.h>
#include <sys/mman.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/time.h>
#include <string.h>
#include <aio.h>

#define MB 1024

int da_open(const char *name);
int da_aio_write(const int d, struct aiocb *aiorp, void *buf, const int count);
int da_test_wait( struct aiocb *aiorp );
int da_close(int fd);

int da_open(const char *name){
   int dskr;
   int dskr2;
   dskr = open( name, O_RDWR );
   if( dskr == -1 ){
       printf("Failas sukurtas, nes jo nebuvo\n");
       dskr2 = open( name, O_WRONLY | O_CREAT, 0644);
   }else{
       printf("Toks failas jau yra!\n");
       exit(1);
   }
   printf( "dskr1 = %d\n", dskr2 );
   return dskr2;
}

int da_aio_write(const int d, struct aiocb *aiorp, void *buf, const int count){
   int rv = 0;

   memset( (void *)aiorp, 'a', sizeof( struct aiocb ) );
   aiorp->aio_fildes = d;
   aiorp->aio_buf = buf;
   aiorp->aio_nbytes = count;
   aiorp->aio_offset = 0;
   rv = aio_write( aiorp );

   if( rv == -1) {
       printf("ERROR!!! ");
       exit(1);
       return rv;
   }
   return rv;
}

int da_test_wait( struct aiocb *aiorp ){
   const struct aiocb *aioptr[1];
   int rv;
   aioptr[0] = aiorp;
   rv = aio_suspend( aioptr, 1, NULL );
   if( rv != 0 ){
      perror( "aio_suspend failed" );
      abort();
   }
   rv = aio_return( aiorp );
   printf( "AIO complete, %d bytes write.\n", rv );
   return 1;
}

int da_close(int fd){
   int rv;
   rv = close( fd );
   if( rv != 0 ) perror ( "close() failed" );
   else puts( "closed" );
   return rv;
}

int main(int argc, char *argv[] ){
    int sk;
    int d;
    struct aiocb aior;
    if(argc == 3){
        sk = atoi(argv[2]);
        char buffer[MB * MB * sk];
        memset(buffer, 0, sizeof buffer);
        d = da_open(argv[1]);
        da_aio_write( d, &aior, buffer, sizeof(buffer) );
        da_test_wait( &aior );
        da_close( d );
    }
    return 0;
}

Aucun commentaire:

Enregistrer un commentaire