1

I need to fill my file with same numbers for example 00000.... I want to use asynchronous aio_write function. But here what I get

^@ w▒(▒▒▒▒▒l▒@^@Y▒^@^@^@^@▒▒▒▒u▒l▒@*`▒^@ w▒h▒▒▒ ......

Here's my code

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(&aior, 0, sizeof( struct aiocb ));
            d = da_open(argv[1]);
            da_aio_write( d, &aior, buffer, sizeof(buffer) );
            da_test_wait( &aior );
            da_close( d );
    }
    return 0;
}

and here's my asynchronous writing function (I think this function is bad)

int da_aio_write(const int d, struct aiocb *aiorp, void *buf, const int count){
   int rv = 0;
   memset( (void *)aiorp, 0, 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 da_aio_write\n");
       exit(1);
       return rv;
   }
   return rv;
}

Also here's I wait for asyncronius function to end

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;
}

Also here's 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>
 #include <errno.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("File created\n");
       dskr2 = open( name, O_WRONLY | O_CREAT, 0644);
   }else{
       printf("End job!\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, 0, 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 da_aio_write\n");
       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(&aior, 0, sizeof( struct aiocb ));
                d = da_open(argv[1]);
                da_aio_write( d, &aior, buffer, sizeof(buffer) );
                da_test_wait( &aior );
                da_close( d );
        }
        return 0;
}
David
  • 33
  • 4

1 Answers1

1
#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>

int da_open(const char *name);
int da_aio_read(const int d, struct aiocb *aiorp, void *buf, const int count);

int da_open(const char *name){
   int dskr;
   int dskr2;
   dskr = open( name, O_RDWR );
   if( dskr == -1 ){
       dskr2 = open( name, O_WRONLY | O_CREAT, 0644);
   }else{
       exit(1);
   }
   return dskr2;
}

What is going on here? Is this an obfuscated way to make sure you don't write to a file if it already exists? It is obviously incorrect as the file could have appeared before the second open. You can use O_EXCL instead.

The code is additionaly obfuscted by not handling exit earlier.

int da_aio_read(const int d, struct aiocb *aiorp, void *buf, const int count){
    int rv = 0;
    memset( (void *)aiorp, 0, sizeof( struct aiocb ) );
    //memset(buf, 0, sizeof( buf) );
    aiorp->aio_fildes = d;
    aiorp->aio_buf = buf;
    aiorp->aio_nbytes = count;
    aiorp->aio_offset = 0;
    rv = aio_write( aiorp );
    return rv;
}

First off, what the fsck. Why are you calling a writing function something_read?

What's the use of rv?

If you read any docs on aio you will see you have to explicitly wait for event completion.

int main(int argc, char *argv[] ){
    int sk;
    int d;
    struct aiocb aior;
    char buffer[100];
    memset(buffer, 0, sizeof buffer);
    if(argc == 3){
        sk = atoi(argv[2]);
        d = da_open(argv[1]);
        da_aio_read( d, &aior, buffer, sizeof(buffer) );
    }
    return 0;
}
  • First I want to create file only if it doesn't exist. If file exist I want that my program print error. Second I think that all troubles is with `da_aio_write` function (I try to wait for event completion with aio_suspend ) – David May 06 '15 at 10:43