スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

SIGCHLDの活用

1秒に1回ずつ"waiting"と出力する。子がexitを呼び出したら、親はこの終了ステータスを報告するメッセージを出力して終了する。


#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/wait.h>

#define DELAY 5

void signal_handler(int signum);

int main(void){

int newpid;
void child_code(), parent_code();

printf("before: mypid is %d\n", getpid());

if(( newpid = fork()) == -1){
perror("fork");
}else if(newpid==0){
child_code(DELAY);
}else{
while(1){
printf("waiting...\n");
sleep(1);
signal(SIGCHLD, signal_handler);
}
}
}

void child_code(int delay)
{
printf("child %d here. will sleep for %d seconds \n", getpid(), delay);
sleep(delay);
printf("child done. about to exit\n");
exit(17);
}

void parent_code(int childpid)
{
int wait_rv;
int child_status;

wait_rv = wait(&child_status);

printf("done waiting for %d. Wait retrned: %d\n", childpid, wait_rv);


}

void signal_handler(int signum)
{
int child_status;
int exit_status , signal_number, coredump_flg;

wait(&child_status);
exit_status = child_status >> 8;
signal_number = child_status & 0x7F;
coredump_flg = child_status & 0x80;

/* show child status */
printf("caught signal\n");
printf("\n exit_status = %d, signal_number = %d, coredump_flg = %d\n",
exit_status, signal_number, coredump_flg);

exit(EXIT_SUCCESS);
}


スポンサーサイト
プロフィール

tjnet777

Author:tjnet777
Solaris, VPNのサポート業務を1年

金融系SIerで業務アプリの開発、メンテを3年半

離職して大学院大学 1年生

最新記事
最新コメント
最新トラックバック
月別アーカイブ
カテゴリ
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QR
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。