web-dev-qa-db-ja.com

システムコールwrite()を画面に出力するにはどうすればよいですか?

私のOSクラスでは、システムコールのみを使用してLinuxのcatを実装することになっています(printfなし)

読み取り この参照 ファイルへの印刷に使用されていることがわかりました。私はofstreamを操作する必要があると思います。

例は次のとおりです。ofstream outfile ("new.txt",ofstream::binary);

どうすれば画面に書き込むことができますか?

編集:このwrite()はiostreamライブラリの一部であることに気付きました。これは、int write(int fd、char * buf、int size)システムコールと同じですか?

14
andandandand

標準出力または標準エラー(それぞれ1と2)のファイル記述子に書き込みます。

8
Jerry Coffin

システムコールは、Linuxカーネルによって提供されるサービスです。 Cプログラミングでは、関数はlibcで定義され、多くのシステムコールのラッパーを提供します。関数呼び出し write() は、これらのシステムコールの1つです。

write() に渡される最初の引数は、書き込むファイル記述子です。シンボリック定数_STDERR_FILENO_、_STDIN_FILENO_、および_STDOUT_FILENO_は、それぞれ 2 0 に定義されています。 、および 1 in unidtd.h STDOUT_FILENO または STDERR_FILENO のいずれかに書き込みます。

_const char msg[] = "Hello World!";
write(STDOUT_FILENO, msg, sizeof(msg)-1);_

または、 syscall() 関数を使用して、 syscall.h または unistd.h 。このメソッドを使用すると、システムコールのみを使用していることを保証できます。 Linuxシステムコールクイックリファレンス (PDFリンク)が役立つ場合があります。

_/* 4 is the system call number for write() */
const char msg[] = "Hello World!";
syscall(4, STDOUT_FILENO, msg, sizeof(msg)-1);_
24
jschmier
#include <unistd.h>
/* ... */
const char msg[] = "Hello world";
write( STDOUT_FILENO, msg, sizeof( msg ) - 1 );

最初の引数は、STDOUT(通常は1)、2番目は書き込み元のバッファー、3番目はバッファー内のテキストのサイズ(-1はゼロターミネータを出力しないことです)。

3
#define _GNU_SOURCE         /* See feature_test_macros(7) */    
#include <unistd.h> // For open, close, read, write, fsync
#include <sys/syscall.h>  //For SYSCALL id __NR_xxx

//Method 1 : API    
write(1,"Writing via API\n",\
        strlen("Writing via API\n") ); 
fsync(1);
//Method 2  : Via syscall id
const char msg[] = "Hello World! via Syscall\n";
syscall(__NR_write, STDOUT_FILENO, msg, sizeof(msg)-1);     
syscall(__NR_fsync, STDOUT_FILENO );    // fsync(STDOUT_FILENO);
2
Renold Wasnik