9

たとえば、 のような標準ライブラリ関数を使用しない場合printf()putchar()どうすれば文字を画面に出力できますか?

それを行う簡単な方法はありますか。私はシステムコールについてあまり知りません。システムコールを使用する必要がある場合、どのように使用すればよいですか? ライブラリ関数を使用せずに印刷する簡単な方法をアドバイスできる人はいますか?

4

4 に答える 4

17

標準 C では、できません。C で定義されている唯一の I/O は、C 標準ライブラリ関数を介したものです。

特定のプラットフォームでは、それを行う方法がある場合があります。

  • カーネル呼び出しを直接行います。これを行うには、おそらくインライン アセンブリを作成する必要があります。writeC ライブラリを使用せずに、litb を直接呼び出すことができます。C ライブラリのソースを入手して、それがどのように行われているかを確認してください。
  • フレーム バッファに直接書き込みます。マルチユーザー OS では、これが許可されないことがよくあります (少なくとも、ライブラリ/カーネルの呼び出しは行わないでください)。

独自の C ライブラリを作成している場合を除き、なぜこれを行う必要があるのか​​わかりません。

于 2009-01-22T07:15:31.250 に答える
7

writeLinux では、システム コールを使用できます。

write(1, "hello\n", 6); // write hello\n to stdout

それが十分に得られない場合は、1 段階下に移動して、syscall を一般的に呼び出すことができます。

syscall(__NR_write, 1, "hello\n", 6);

strace特定のプログラムの実行中にどのシステムコールが使用されているかを確認するために使用できるについて知っておくとよいでしょう。ただし、「いくつかの単純なパーサー」の場合、生のシステム コールを使用する必要はほとんどないことに注意してください。c ライブラリの関数を使用することをお勧めします。

ところで、c 標準ライブラリを使用せずに Windows で上記を実行する場合は、WriteFile および GetStdHandle 関数に注意してください。ただし、Linux ソリューションのようにはなりません。

于 2009-01-22T07:05:11.600 に答える
4

質問の下にあるハオ氏からのコメントで、簡単な回答が1つ見つかりました。彼の答えは、このような単純なプログラムです

ターボ C (DOS プログラム):

char far* src = (char far*) 0xB8000000L; 
*src = 'M'; 
src += 2; 
*src = 'D'; 

またはこれを試してみてください: http://en.wikipedia.org/wiki/Brainfuck :) – //Hao (1 時間前)

Turbo Cで試してみましたが、うまくいきました。このような単純な解決策が欲しかったので、正解として受け入れたかったのですが、彼(Hao)がコメントとしてそれを提供したので、他のユーザーが彼に代わってこれについて知ることができるようにここに貼り付けて受け入れました。もう一度、ハオさんに感謝します。

于 2009-01-22T09:20:02.077 に答える