それでは毛玉諸君、これにて失敬

日々の精進を備忘録的に綴ります。

ふつうのLinuxプログラミング1

gccがインストールされているか確認

gcc -dumpversion
>> 9

gccを使ったビルド

src配下にhello.cを書いた

ビルド
a.outが出来た

gcc src/hello.c
ls
>> a.out src

実行してみる

./a.out
>> Hello, World!

gccを使ったビルド(2)

生成されるプログラムの名前を変更

gcc -o hello hello.c
./hello

コマンドライン引数

src/args.cを書いた。
argv[0]はコマンド名

オペレーティングシステム

ライブラリ

  • システムコール以外にも使える関数がライブラリ関数
    • printf(), exit(), strlen(), strcpy()など
    • ライブラリに収められているからライブラリ関数
  • 関数をリンクしておくとその関数を呼び出すことができる
  • 重要なのは標準cライブラリ
    • 通称 libc

ファイルシステム

  • 広義のファイル
    • ls で表示された全て
  • 狭義のファイル
    • 内容がそのまま記録されているファイル
    • 画像ファイル、動画ファイル、テキストファイルなど
  • ディレクト
    • 他のファイルを複数入れることが出来るファイル
  • シンボリックリンク
    • 他のファイルの名前を格納したファイル
    • 主な使いみちは、ファイルやディレクトリに別名を付けること
  • バイスファイル
    • バイスをファイルとして表現したもの
    • 例えば /dev/hda は1台目のハードディスクを表す
  • mount コマンドで、現在使っているシステムがどのようなファイルシステムで構成されているか調べられる

プロセス

  • 動作中のプログラムのこと
    • ps ax でコンピュータに存在するプロセスがすべて表示される
  • プロセスIDでプロセスを管理
    • 同じプログラムを同時に実行してもプロセスIDで識別できる

ストリーム

  • バイトストリーム
    • バイト列が流れる通り道
    • バイト列が出たり入ったりするものはなんでもストリーム
    • キーボードは押下されたキーを表すバイトの列を送りつけてくるストリーム
  • プロセスがファイルの内容にアクセスしたいとき
  • ストリームからバイト列を取り出すことをread, バイト列を流し込むことをwriteという
  • ストリームの両端にプロセスが付いているものをパイプと呼ぶ
  • ストリームが別のコンピュータに伸びている場合はネットワーク通信となる

クレデンシャル

  • 「ユーザーAとしてアクセスする」とは「ユーザーAの属性を持ったプロセスがアクセスする」こと
    • Linux上で活動するのは常にプロセス
  • プロセスの属性としてのユーザーのことをクレデンシャルと呼ぶ(信任状、証明書)
  • ログインすると、証明書をもつプロセスがシステム上に作られ、別のコマンドを起動するときに自動的にコピーして渡されていく

端末

  • 昔はコンピュータからの出力はプリンタで長い紙に打ち出されていた
    • 入力は紙テープやタイプライター
    • UNIXでは端末をttyと呼ぶが、由来は teletype
  • Linuxでは物理的な端末がそのまま使われるわけではなく、仮想コンソールが間に挟まっている
    • ソフトウェア的な端末
    • コンソールは端末と同じような意味
  • 端末に「a」を表示させるには
    • 予めメモリ上に「a」を表現する画像を作っておき、文字と数値の対応からその数値を伝える
    • 対応規則のうち、最も普及したのがASCII
  • \007 を出力するとベルがなる
    • コンソールで発生するコンッというやつ
    • bell.c にサンプルコードを記述した

5章

ファイルディスクリプタ

  • プログラムからストリームを扱うために使うもの
  • プログラムから見るとただの整数値
  • ストリームをプロセスに直接見せるわけにはいかない(様々な理由がある)
  • カーネルが持っているストリームを番号と対応付けて、プロセスには番号でストリームを指定させる

stdin, stdout, stderr

  • 普通にシェルからプロセスが起動された場合、どのプロセスにも3つのストリームが用意され、それに対応するファイルディスクリプタも固定されている
  • 標準とはデフォルトの意
    • 例えばcatコマンド
      • 標準入力は端末(キーボードからの入力)
      • 標準出力も端末(モニターへの出力)
    • ファイルをcatコマンドにリダイレクト
      • 標準入力はファイル
      • 標準出力は端末
      • catコマンドはどこから出力内容を読み込んでいるかは知らない(シェルがやっている)
  • 多くのLinuxコマンドが統一的に「標準入力から読み込んで標準出力に書き込む」というルールに従っている
    • コマンドを組み合わて複雑な処理を行うことが可能

voidとは?(雰囲気だけ)