私のOSクラスでは、システムコールのみを使用してLinuxのcatを実装することになっています(printfなし)
読み取り この参照 ファイルへの印刷に使用されていることがわかりました。私はofstreamを操作する必要があると思います。
例は次のとおりです。ofstream outfile ("new.txt",ofstream::binary);
どうすれば画面に書き込むことができますか?
編集:このwrite()はiostreamライブラリの一部であることに気付きました。これは、int write(int fd、char * buf、int size)システムコールと同じですか?
標準出力または標準エラー(それぞれ1と2)のファイル記述子に書き込みます。
システムコールは、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);
_
#include <unistd.h>
/* ... */
const char msg[] = "Hello world";
write( STDOUT_FILENO, msg, sizeof( msg ) - 1 );
最初の引数は、STDOUT
(通常は1
)、2番目は書き込み元のバッファー、3番目はバッファー内のテキストのサイズ(-1
はゼロターミネータを出力しないことです)。
#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);