1

0 またはその他の文字で満たされたファイルを作成したい。これが私の機能です

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

これが私のメインです

int main(int argc, char * argv[]){
        int des;
        int rv;
        struct aiocb aior;
        char buffer[1000];
        if(argc == 3){
                printf("just %s\n", argv[1]);
                des = createFile(argv[1]);
                rv = fill(des, &aior, buffer, sizeof(buffer));
        }
        return 0;
}

したがって、出力はゼロ値で満たされたファイルである必要がありますが、ファイルはガベージで満たされています

^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@$
y▒^X^@^@^@^@^@^@^@
s|▒^@^@^@^@^@^@^@^@^@^@^@^@▒r|▒^@^@^@^@▒▒^?▒(▒▒▒▒▒{▒▒
y▒^P^@^@^@▒
y▒^A^@^@^@d^Cy▒^@^@^@^@▒
y▒^T
y▒^P▒▒▒^@^@^@^@^@^@^@^
...

なんで?どうしたの?

コードは次のとおりです。

sukurti - そのファイルが存在しない場合は新しいファイルを作成し、fill - 作成したファイルを埋める

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#include <aio.h>
#define MB 1024

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

int sukurti(char *name){
   int dskr;
   dskr = open( name, O_RDONLY );
   if( dskr == -1 ){
          printf("Failas sukurtas, nes jo nebuvo\n");
          dskr = open( name, O_WRONLY | O_CREAT, 0644);

   }else{
           printf("Jau yra toks failas!\n");
           exit(1);
   }
   return dskr;
}

int fill(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 );
        return rv;

}

int main(int argc, char * argv[]){
        int des;
        int rv;
        struct aiocb aior;
        int x = atoi(argv[2]);
        printf("%d\n", x);
        int size = MB * MB * x;
        char buffer[size];
        if(argc == 3){
                printf("just %s\n", argv[1]);
                des = sukurti(argv[1]);
                rv = fill(des, &aior, buffer, sizeof(buffer));
        }else{
                printf("Blogas\n");
        }
        return 0;
}

編集:ファイルへの書き込みが終了することを知っています

4

2 に答える 2

5

ここに 3 つの問題があります。

  1. buffer初期化されていません。を使用してこれを行います

    memset(buffer, 
      <what ever 8bit value you want the file to be filled with>, 
      sizeof buffer);
    

    で定義した直後main()

  2. aior間違って初期化されています。0を使用してすべてに初期化します

    memset(aiorb, 0, sizeof aior);
    

    in で定義した直後に inmain()への呼び出しを削除しmemset()ますfill()

  3. 最後に、バッファーが非同期的にディスクに書き込まれる前にプログラムが終了する可能性が最も高くなります。

    これを修正するには、 で説明されているように通知メソッドを定義しますman 7 aio。そして、プログラムを終了する前に、この通知が受信されるまでプログラムを待機させます。

    これは、たとえば、シグナルを介して完了通知を要求し、このシグナルを待機することで実行できます。

    そのためには、コードを次のように変更します。

    • 次の 2 行を、aiorp指している in の初期化に追加しfill()ます。

      aiorp->aio_sigevent.sigev_notify = SIGEV_SIGNAL;
      aiorp->aio_sigevent.sigev_signo = SIGUSR1;
      
    • 送信された通知シグナルを (プログラムを終了せずに) 処理できるようにするには、シグナル ハンドラーをセットアップする必要があります。

      void handler(int sig)
      {
        /* Do nothing. */
      }
      
    • を呼び出して、このハンドラーをインストールします。

      signal(handler, SIGUSR1);
      

      番組冒頭すぐ。

    • 次のように見える可能性のある呼び出しreturnから ing する前に:main()wait_for_completion(SIGUSR1)

      void wait_for_completion(int sig)
      {
        sigset_t set;
        sigemptyset(&set);
        sigaddset(&set, sig);
      
        sigwait(&set, &sig); /* This blocks until sig had 
                                been received by the program. */
        printf("Completion notification for asynchronous 'write'-operation received.\n");
      }  
      

    必要に応じてエラー処理を追加します。読みやすさのために省略しました。

于 2015-04-28T16:28:03.200 に答える
4
  memset( (void *)aiorp, '0', sizeof( struct aiocb ) );

0ではありません'0'。実際には ASCII 値を使用する必要があります (正しく思い出せば 48)。

于 2015-04-28T14:23:42.817 に答える