[Linux]--基础I/O

[Linuxの] - IOベース

今日では、審査時には、LinuxのベースI / Oを参照してください、私は、アイデアの下に再編成の基本的なI / O操作を確認する必要性を感じました。
ここでは、標準入力ファイルと出力ファイルのC言語ライブラリに2つのコードを書くために

C言語のI / Oの標準ライブラリを想起

test.cの内側にファイルを書き込みます

#include <stdio.h>
#include <string.h>

int main()
{
 	FILE *fp=fopen("myfile.txt","w");
 	if(!=fp)
 	{
 		printf("fopen error\n");
 	}
	const char *msg="hello world\n";
	int count=5;
	while(count--)
	{
	fwrite(msg,strlen(msg),1,fp);
	}
	fclose(fp);
	return 0;
	}

ファイルを読むためのtest.cの内部

#include <stdio.h>
#include <string.h>

int main()
{
	FILE *fp=fopen("myfile.txt","r");
	if(!=fp)
	{
		printf("fopen error\n");
	}
	char buff[1024];
	const char*msg="hello world";
	while(1)
	{
	ssize_t s=fread(buff,1,strlen(msg),fp);
	if(s>0)
	{
		buff[s]=0;
		printf("%s",buff);
	}
		if(feof(fp)
		{
		break;
		}
	}
	fclose(fp);
	return 0;
	}		

プロ試験C含量の次の3つの方法は、画面に印刷することができます

#include <stdio.h>
#include <string.h>

int main()
{
	const char*msg="1:hello world\n";
	fwrite(msg,strlen(msg),1,stdout);
	printf("2:hello world\n");
	fprintf(stdout,"3:hello fprintf\n");
	return 0;
}

出力結果は次のとおりです。
1:こんにちはの世界
2:こんにちは、世界
3:こんにちは、世界
正確には、3つのデフォルトのC言語入力および出力ストリーム、つまり標準入力、標準出力と標準エラーがあると言うことは
、すべてのタイプのこれらの3つのストリームを見つけることになるmanページでは、 FILEは*です。

ファイルシステムのI / O

それは、C ++も、C-ファイル操作インターフェイスに加えて、することができます見ることができます。そのLinnuxの下では、デバイスは、我々は、これらのデバイスを使用する場合、これらのファイルを開くことであると、ファイルの形です。これは、Linuxのファイルで、我々はそれにアクセスする方法ですか?
まず、ファイルを開くには:
open関数プロトタイプ:(1)
INTオープン(CONSTチャー*パス名、モードmode_t、フラグINT);
関数ヘッダーファイルを:
の#include <SYS / types.h>に
する#include <SYS / stat.hで定義され>
# <fcntl.h>含ま
:パラメータ
開いているか、そのような「myfile.txtの」として、ファイル名を作成します。:パス名を
フラグ:あなたが操作を行うことを表明方法。O_RDONLY(読み取り専用)があり、O_WRONLY(書き込みのみ)、O_RDWR(読み書き)、O_PPEND(追加書き込み)、O_CREAT(ファイルの作成)、O_TRUNC(ファイルは、元のデータがクリアされています)。必須最初の3つのオプションである、後者の3つのオプションは任意です。(もちろん、多くのオプションがあり、読者はただ一般的に使用される少数を示すために、アクセスに無料です)
MODE:あなたは、現在のファイルの操作する権限コードを作成する必要があり、それが作成された場合にのみ、このパラメータは便利になるだろう
返り値:
故障復帰へ-1成功戻り非負整数(すなわち、ファイルディスクリプタ - オープンファイルのハンドル操作に、後述します)

(2)クローズ関数プロトタイプが
近いint型(int型のfd);
ヘッダファイル: `する#include <unistd.h>
パラメータここでは本当に何もない、開いているファイルの呼び出しは、オペレータを返し
、ファイルの読み取りに(3)
ヘッダを:書式#include <unistd.h>
関数のプロトタイプ:
ssize_tの読み取り(FD int型ボイドbufは、size_tの数);
パラメータ:
FD:呼び出し、ファイルのオープンオペレータに戻って
ファイルバッファから元のデータを格納するために使用:BUF
数:バイト数を読み出し
戻り値:
ファイルの終わりに、それはそうでなければ0戻り-1を返す場合バイトの戻り正常固有番号を読み出す
(4)ライトデータ
:ヘッダファイル <。unistd、H>の#include
機能をプロトタイプ:ssize_tの書き込み(FD int型、空のconst
bufは、size_tのCOUNT);
パラメータ:
FD:呼び出しオープンファイルディスクリプタに戻る
BUF:決してストアデータバッファ
数:書込みデータのバイト数が
*戻り値: *の数が正常に書き込まれたバイトを返す、返すことができなかった-1

コードの実装

私たちが達成している場合はそれを行う方法を、test.cのの内側への書き込みに、ファイルの先頭に言いましたか?この使用はこれに私たちは知識について話していると、コードにあまり話をしませんでした。

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcnl.h>
#include <unistd.h>
#include <string.h>

int main()
{
	umask(0);
	int fd=open("myfile.txt",O_WRONLY|O_CREAT,0644);
	if(fd<0)
	{
	perror("open error\n");
	return -1;
	}
	int count=5;
	const char*msg="hello world\n";
	int len=strlen(msg);
        while(count--)
        {
        	write(fd,msg,len);
     	}
     	close(fd);
     	return 0;
}

ファイルのパーミッションを0に設定するたびに意味のumask

ファイルディスクリプタ

オープン関数に学習することにより、私たちはファイルディスクリプタは非負の整数であることを知って、彼はそのような能力は、私たちにファイルそれへのアクセスを許可する必要があり、最後には何ですか?
簡単に言えば、ファイル演算子、我々はまた、C言語を言及する前にハンドルのファイル操作は、実際には、標準入力と出力があること:3つのファイル記述子に関連して、私たちに何が起こる標準入力、標準出力、標準エラー出力、 :0 標準入力に対応し、1に対応する標準出力、2は、対応する標準誤差ですこのように、一般的なオープン、既存のファイルまたは新規ファイルを作成し、カーネルはプロセスにファイル記述子を返しますが、また、すでにので最初の3つのオープンAファイル、ファイルディスクリプタ3は、最初からある理由を理解します占有されています。
ここに画像を挿入説明
私たちは通常、プロセス制御ブロックと呼ばれるプロセスに関連するテーブルを維持するためにtask_struct構造を持っているLinuxカーネルでは、ファイルを開くと、このブロックファイルの記述と呼ばれる構造file_structに*ファイルポインタがあるでしょうこの表は、配列へのポインタが含まれている、ファイルを開くための指針となっている要素は、通常の状況下では、プロセスは専用のファイルディスクリプタを通じて、直接アクセスファイルに方法はありません、これは見つけるために、インデックステーブル記述子テーブルですファイル。

リダイレクト

コードの一部を初めて目:

#include  <stdio.h>
#include <sys/type.h>
#include <sys/stat.h>
#include <fcntl.h>

int main()
{
	close(0);
	//close(2);
	int fd=open("myfile.txt",O_RDONLY);
	if(fd<0)
	{
	perror("open file");
	return 1;
	}
	printf("fd:%d\n",fd);
	close(fd);
	return 0;
}

0(閉じたとき2、出力がfdとされています:2)、これはどういう意味?このコードでは、私は、その出力がfdとされた、0(またはそれに近い2)を閉じましたか それが私たちの割り当てルールファイルのオペレータが、現在は新しいファイルディスクリプタとして使用されていない最小のインデックスを検索するために、配列の中file_structで、あるあります。
質問は1、それをオフにしない理由は、ありますか?

#include  <stdio.h>
#include <sys/type.h>
#include <sys/stat.h>
#include <fcntl.h>

int main()
{
	close(1);
	int fd=open("myfile.txt",O_WRDONLY|O_CREAT,0664);
	if(fd<0)
	{
	perror("open error");
	return 1;
	}
	printf("fd:%d\n",fd);
	fflush(stdout);
	close(fd);
	return 0;
}

この時点で、我々はそれがFD = 1は、この現象はリダイレクトと呼ばれ、ファイルmyfile.txtのの内側に表示出力上のコンテンツに出力されている必要がありました。

ここに画像を挿入説明
それは何を意味するのでしょうか?我々は、すべての書かれた内容では、標準出力、我々は新しいファイルを開くと、ファイル記述子1に割り当てられますが、ファイルに割り当てられますされ1、ファイルディスクリプタ番号1を閉じたその理由は、されています彼はむしろ、標準出力に比べ、myfile.txtのを書きました。
LinuxがLinuxの、元のデフォルトの何かを変更し、元のシステムコマンドのデフォルトの実装を変更するには、リダイレクト手段は、例えば、私は単に表示の出力に表示したくないが、ファイルへの出力をしたい、あなたがすることができますこの作業を実行するためにリダイレクトします。あなたはそれを得ますか?

公開された33元の記事 ウォン称賛13 ビュー1067

おすすめ

転載: blog.csdn.net/Vicky_Cr/article/details/102905445