Linuxシステムコールの勉強(その5)

Linuxシステムコール

Linuxシステムコール

前回はこちら


前回はsignal()システムコールを使用して、シグナルを受け取った際の動作を変更出来るところまで説明しました。今回は自プロセス、もしくは他プロセスに対してシグナルを送信する方法についてまとめます。


プロセスにシグナルを送信する関数は大きく3つあります。

関数定義(引数) 引数の説明 返却値(説明) 宣言ヘッダー(*.h) 自プロセス
への送信
他プロセス
への送信
alarm(unsigned int sec) シグナル送信
までの秒数
unsigned int
(シグナル発生までの残時間)
unistd.h ×
raise(int sig) シグナル番号 int
(送信結果[0-成功,0以外失敗])
signal.h ×
kill(pid_t pid, int sig) pid=送信プロセス
sig=送信シグナル番号
int
(送信結果[0-成功,-1-失敗])
sys/types.h
signal.h


同一プロセス間でシグナルを送信する場合にはalarm()とraise()およびkill()が使用可能です。他プロセスに対してシグナルを送信する場合にはkill()を使用します。


#include <stdio.h>
#include <unistd.h>
#include <signal.h>

int main()
{
    pid_t pid;
    int   i  ;

    // プロセスの複製失敗 //
    if ((pid = fork()) == -1)
    {
        perror("fork()");
        return 1;
    }

    // 複製後の親プロセスの場合 //
    else if ( pid > 0 )
    {
        printf("Sleep 10 seconds\n");
        sleep(10);

        // 子プロセスへSIGKILLを送信 //
        if (kill(pid,SIGKILL) == -1)
        {
            perror("kill()");
            return 2;
        }
        printf("Child Process(%d) is killed\n",pid);
    }
    else
    {
        i = 1;
        for (;;i++)
        {
            printf("I am Child Process(%d...)\n",i);
            sleep(1);
        }
    }
    return 0;
}


これを試してみるとこうなります。

[itotto@itotto ~]$ ./sigkl
Sleep 10 seconds
I am Child Process(1...)
I am Child Process(2...)
I am Child Process(3...)
I am Child Process(4...)
I am Child Process(5...)
I am Child Process(6...)
I am Child Process(7...)
I am Child Process(8...)
I am Child Process(9...)
I am Child Process(10...)
Child Process(98024) is killed
[itotto@itotto ~]$


プログラム実行後に起動されたプロセス(親プロセス)は

Sleep 10 seconds


というメッセージを表示して10秒間停止します。その後、子プロセスが

I am Child Process(1...)
I am Child Process(2...)
I am Child Process(3...)
I am Child Process(4...)
I am Child Process(5...)
I am Child Process(6...)
I am Child Process(7...)
I am Child Process(8...)
I am Child Process(9...)
I am Child Process(10...)


と表示したところで停止していた親プロセスが動作して子プロセスを停止。そして

Child Process(98024) is killed


と表示したところで処理が完了します。


プロセス間で通信をする場合にはシグナル以外にも名前付き(なし)パイプやソケット通信などがありますが、送信出来るデータに制限がある点を除けばシグナルを送信する方法が一番簡単に実装出来ます。


これでシグナルを送信する方法は終わりです。次回は5章の低水準ファイル入出力です。


次へ進む