- システムサービス:プログラムの実行
-
$ 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 (秒数)
で発動。
- sigaction 構造体
終わらなかった…。次に続きます。