書き込み(システムコール)

ウィキペディアから、無料の百科事典
ナビゲーションにジャンプ 検索にジャンプ

書き込みは、 Unixライクなオペレーティングシステムカーネルによって提供される最も基本的なルーチンの1つですユーザーが宣言したバッファーから、ファイルなどの特定のデバイスにデータを書き込みます。これは、システムコールを直接使用してプログラムからデータを出力するための主要な方法です。宛先は数値コードで識別されます。書き込まれるデータテキストなど)は、ポインターとバイト数で指定されたサイズによって定義されます。

writeしたがって、3つの引数を取ります。

  1. ファイルコード(ファイル記述子またはfd)。
  2. データが格納されているバッファへのポインタ( buf)。
  3. バッファから書き込むバイト数(nbytes)。

POSIXの使用法

書き込み呼び出しインターフェース[1] [2] [3]は、POSIX仕様によって標準化されています。書き込み関数を呼び出すことにより、データがファイルに書き込まれます。関数プロトタイプは次のとおりです。

 ssize_t write int fd const void * buf size_t nbytes );       
口論 説明
fd
これは、openの呼び出しから取得されたファイル記述子です。整数値です。標準入力、標準出力、および標準誤差に対して、それぞれ値0、1、2を指定することもできます。
buf
これは、fdが指すファイルに書き込まれるコンテンツを含む文字配列を指します。
nbytes
これは、文字配列からfdが指すファイルに書き込まれるバイト数を指定します。

上記の構文でssize_tは、はtypedefです。これは、で定義された符号付きデータ型stddef.hです。write()符号なしの値を返さないことに注意してください。エラーが発生した場合は-1を返すため、符号付きの値を返す必要があります。
write関数は、ファイルに正常に書き込まれたバイト数を返します。これは、指定されたnbytesよりも少ない場合があります。例外的な状態が発生した場合は-1を返します。以下のエラーに関するセクションを参照してください。

使用例

#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 
#include <fcntl.h> 
#include <unistd.h> 

int main int argc char * argv [])     
{{
    int fd1 ; 
    char buf [ 128 ]; 
    fd1 = open argv [ 1 ]、O_WRONLY );   
    if fd1 == -1 {    
        perror argv [ 1 ]);
        EXIT_FAILUREを返します; 
    }

    / *ファイルに書き込むデータを入力します* /
    scanf "%127s" buf ); 

    write fd1 buf strlen buf )); / * fd1はファイル記述子、bufはデータを保持するために使用される文字配列、strlen(buf)は、バッファ内の文字列の長さに等しいバイト数をコピーする必要があることを関数に通知します* /   



    close fd1 );

    0を返す; 
}

操作中に発生したエラー

以下にリストされているのは、ファイルへの書き込み中に発生する可能性のあるいくつかのエラー[4] [5]です。エラーは、errno.hにリストされているマクロです。

エラー番号 エラー 意味
4
EINTR
システムコールが中断されました。
5
EIO
低レベルのエラー。多くの場合、ハードウェアの読み取り/書き込み操作に関係します。
9
EBADF
ファイル記述子fdが無効であるか、「読み取り専用」モードで開かれたファイルに書き込もうとしています。
13
EACCES
ユーザーには、ファイルへの書き込みに必要な権限がありません。
14
EFAULT
関数で指定されたアドレスが無効なアドレスです。
22
EINVAL
関数で渡された引数は無効です。
27
EFBIG
nbytesで指定されたファイルサイズが大きすぎて、システムで許可されているサイズよりも大きくなっています。
28
ENOSPC
ストレージデバイスへの書き込みに使用できるスペースがありません。
32
EPIPE
パイプが壊れているか、パイプのもう一方の端にあるファイルがI / O目的で開かれていません(このタイプのエラーを発生させるほとんどのプロセスは、SIGPIPE信号も生成します)。

write

書き込みを呼び出す高レベルI / O関数

書き込みシステムコールは、よく似ていますが、通常の関数ではありません。たとえば、x86アーキテクチャを備えたLinuxでは、システムコールは、制御をカーネルに移すために、命令INT80Hを使用します。[6]低レベル関数である書き込みシステムコールとそれに対応する読み取りは、バイトしか理解できませんクラスのように、書き込みを使用してレコードを書き込むことはできませんしたがって、より高いレベルの入出力関数(printfなど))が必要です。多くの場合、雑然とした低レベルのインターフェイスと比較して、高レベルのインターフェイスが優先されます。これらの関数は内部で他の関数を呼び出し、次にこれらは書き込みを呼び出すことができ、関数の階層化されたアセンブリを生成します。[7] [8]

このアセンブリを使用すると、高レベルの関数でバイトのデータを収集し、必要なデータをファイルに書き込むことができます。

も参照してください

参考文献

  1. ^ http://www.unix.com/man-page/FreeBSD/2/write/書き込みのマニュアルページ
  2. ^ https://www.gnu.org/s/hello/manual/libc/I_002fO-Primitives.html#I_002fO-Primitives I / O Primitives
  3. ^ 「書く」
  4. ^ https://www.gnu.org/s/hello/manual/libc/Error-Codes.html GNUCライブラリマニュアル
  5. ^ http://www.ibm.com/developerworks/aix/library/au-errnovariable/IBMページリストエラー
  6. ^ LINUXアセンブリ言語プログラミングBobNeveln ISBN 978-0-13-087940-0 
  7. ^ https://www.gnu.org/s/libc/ GNUCライブラリ
  8. ^ http://ftp.gnu.org/gnu/glibc/ GNUCライブラリのダウンロード

外部リンク