スポンサーサイト

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

複数のSIGCHLD

引数として整数を取り、複数の子プロセスを作成する。


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

#define DELAY 5

int num_dead_proc;

int check_argument(int argc);
void multi_fork(int proc_cnt);
void child_code(int delay);
void parent_code(int childpid);
void signal_handler(int signum);
int single_fork(void);
void multi_wait(int num);


int main(int argc, char *argv[]){
int proc_cnt;
int idx;
/* check argument */
check_argument(argc);
/* start message */
printf("before:mypid = %d\n", getpid());

proc_cnt = atoi(argv[1]);
/* fork */
multi_fork(proc_cnt);
/* wait */
multi_wait(proc_cnt);

}

int check_argument(int argc){
if(argc != 2){
puts("checking number of arguments");
exit(EXIT_FAILURE);
}
}

void multi_fork(int proc_cnt){
int pid;
int i;
for(i=0; i<proc_cnt; i++){
pid = fork();
switch(pid){
case -1:
perror("fork error");
break;
case 0: //child
child_code(DELAY);
break;
default:
;
}
}


}

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(EXIT_SUCCESS);
}


void signal_handler(int signum){
int child_status;
pid_t pid;

pid = wait(&child_status);
printf("Wait returned: %d\n", pid);
num_dead_proc++;
}

void multi_wait(int num){
int num_of_dead_proc = 0;
for(;;){
int child_status;
printf("waiting...\n");
sleep(1);
signal(SIGCHLD, signal_handler);
if(num_dead_proc == num)
break;// all process dead
}

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

tjnet777

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

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

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

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

この人とブロともになる

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