LoginSignup
1
0

More than 5 years have passed since last update.

C で覚えたことまとめメモ vol.3

Last updated at Posted at 2018-05-02

vol.1

vol.2

の続きです。

  • システムサービス:プログラムの実行
    • $ ps -efでプロセス表示
    • int system( const char *command );
      セキュリティ的に問題あるからあんまり使わないほうが良い。
    • exec()は exec+バージョンのオプションで色々種類がある。
      ヘッダーはunistd.h
      l:引数がリスト
      v:引数が配列 / ベクトル
      p:パスの検索
      e:環境変数
    • exec() の引数について
      プログラム
      コマンドライン引数(最初のコマンドライン引数はプログラム名 == 始めの引数と一緒)
      NULL (コマンドライン引数の最後を知らせる)
      環境変数(配列)
    • 例えば
      execle ("/app/hoge", "/app/hoge", "arg01", "arg02", NULL, my_env);
      execvp ("hoge", my_args);
    • C プログラムは環境変数をgetenv()で読み取れる。
    • exec()が失敗した時
      errno変数にエラーが格納されている。ヘッダーはerrno.h
      string.hの関数でstrerror (errno)ってするとエラーテキストとして取り出せる。
    • exit()
      ヘッダーはstdlib.h
      通常終了なら引数に0、異常終了ならそれ以外。この辺は調べるべし。
    • プロセスのフォーク
      pid_t pid = fork()成功すると、子プロセスは0、親プロセスは、フォークした子プロセスのプロセスIDを返す。
  • プロセス間通信
    • ディスクリプタの取得
      int fileno (FILE *file);
    • データストリームの複製
      int dup2 (int oldhandle, int newhandle);成功したら0、失敗で-1
    • 子プロセスの完了を待つ
      pid_t waitpid(pid_t pid, int *status, int options);
      pid親プロセスが子プロセスをフォークした際のプロセスID。
      pid_statusプロセスの終了情報が格納される。
      optionsオプション。完了待ちなら0。
    • pid_statusの中身
      WEXITSTATUS(pid_status)っていうマクロに渡すとわかる。
  • パイプ
    • int fd[2]; pipe(fd); fd[0] が読み込む側、fd[1] が書き込む側。 dup2 で標準入出力にコピー。
      プロセスによって、使わない方は閉じる。close(fd)ヘッダーはunistd.h
      ちなみにfgetsとかで、fd[1] につながってる stdin からの入力を読んだりする場合、fd[1] を閉じとかないと、永遠と入力を待つ感じになるので注意。
      それから、一回閉じたファイルは標準出力とかであっても開き直さないと挙動がおかしくなる。
      for 文とかでループする時にハマった。freopen()
  • シグナル
    • sigaction 構造体
      struct sigaction {
      void (*sa_handler)(int);
      void (*sa_sigaction)(int, siginfo_t *, void *);
      sigset_t sa_mask;
      int sa_flags;
      void (*sa_restorer)(void);
      };
      取り急ぎは以下のように設定すればOK
      struct sigaction hoge;
      hoge.sa_handler = action;シグナル受け取った時に呼び出したい関数
      sigemptyset (&hoge.sa_mask);
      hoge.sa_flags = 0;追加のフラグ。とりあえず0でよし。
    • シグナルの登録
      int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact);
      signum:シグナル番号。SIGINTとかのシグナルのシンボルを渡す。
      act:登録したいsigactionのアドレス。
      oldact:オーバーライドするsigaction。特に気にしない場合は NULL。
    • シグナルエスカレーション
      raise(SIGINT)みたいにハンドラ内で呼び出すと、プロセスからプロセス自体にシグナルを送れる。
      SIGALRM アラームシグナル。alarm (秒数)で発動。

終わらなかった…。に続きます。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0