電子書籍の厳選無料作品が豊富!

OSやシェルに詳しい方に質問です。

command < file
のように実行する場合を考えたときに、'<'によって標準入力がfileへリダイレクトされていると認識してました。つまり、C言語で表すなら以下のようなプログラムで実装されていると考えておりました。
close(STDIN_FILENO);
int fd = open(file,O_RDONLY);
dup(fd);
しかし、この実装ではキーボードからの入力が受け取れないのではないかと疑問に感じました。
例えばmoreコマンドを実行する場合を考えると
more -10 < file
fileの中身が10桁ずつ表示されます。しかし、標準入力からの入力('q'やEnter)も受けとることができます。'<'のアルゴリズムがどうなっているのか教えていただきたいです。

pipeシステムコールを利用すれば実装できる気もするのですが、実際にどのようにプログラムすればいいのかがわからないです、、、。

よろしくお願いします!

  • 画像を添付する (ファイルサイズ:10MB以内、ファイル形式:JPG/GIF/PNG)
  • 今の自分の気分スタンプを選ぼう!
あと4000文字

A 回答 (4件)

常に端末から読みたいのなら、


FILE *f;
して、あとはOSにより、
WIndows:
f = fopen("CON","r");
Unix/Lnux:
f = fopen("/dev/tty","r");

と端末を読み取りオープンして、そこから読めば良いです。
    • good
    • 0

No.2 のリンク先に



/* Read a number and command from the terminal. Set cmd to the non-digit
* which terminates the number. */
static struct number_command read_command(struct more_control *ctl)
{
  cc_t input[8] = { 0 };
  ssize_t i, ilen;
  struct number_command cmd = { .key = more_kc_unknown_command };

  /* See stderr note in read_user_input() */
  if ((ilen = read(STDERR_FILENO, &input, sizeof(input))) <= 0)
   return cmd;
  if (2 < ilen) {

...ってありますね。
要するに、キーボード入力は stderr から受け取っているらしい。
    • good
    • 0

>実際にどのようにプログラムすればいいのかがわからないです、、、。



実際のところこんな感じじゃないですか?読んでないけど。
https://github.com/util-linux/util-linux/blob/ma …
    • good
    • 0

標準入力はどのアプリケーションで使用しても標準入力として機能します。


標準出力はどのアプリケーションで使用しても標準出力として機能します。
それ以上でも以下でもありません。
OSが提供している機能ですので。

リダイレクト(リダイレクション)はリダイレクト(リダイレクション)として機能します。
それ以上でも以下でもありません。
OSが提供している機能ですので。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!