kotaの日記: signal
日記 by
kota
ちょっと思い立って、プロセスを叩き起こすのに、
signal送るのとselect()使うのと、どっちにしようかまよった。
テストプログラムを、signal使ってつくってみた。
/* wakeup with signal */
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/time.h>
#include <signal.h>
#include <unistd.h>
#define INTERVAL 500000 /* u sec */
#define LOOP 1000 /* times */
int done;
int count=0;
int done;
void shandler(int num);
void pause_and_sendsig(int pid);
void parent_loop(pid_t cpid);
void child_loop(pid_t ppid);
void usleep_overhead();
void shandler(int num){
count++;
if(count>LOOP){
done=1;
}
return;
}
void pause_and_sendsig(int pid){
pause();
usleep(INTERVAL/2);
/* sleep(1);*/
if(kill(pid,SIGUSR1)){
perror("kill");
}
return;
}
void usleep_overhead(){
struct timeval t_start;
struct timeval t_stop;
int sec;
int msec;
int i;
gettimeofday(&t_start,NULL);
for(i=0;i<LOOP*2;i++){
usleep(INTERVAL/2);
/* sleep(1);*/
}
gettimeofday(&t_stop,NULL);
/* done */
sec = t_stop.tv_sec - t_start.tv_sec;
msec = (t_stop.tv_usec - t_start.tv_usec)/1000;
if(msec<0){
sec--;
msec=1000+msec;
}
printf("%d sec %d msec\n",sec,msec);
return;
}
void parent_loop(pid_t cpid){
struct timeval t_start;
struct timeval t_stop;
int sec;
int msec;
signal(SIGUSR1,shandler);
/* wait child init */
sleep(2);
/* start */
gettimeofday(&t_start,NULL);
kill(cpid,SIGUSR1);
while(!done){
pause_and_sendsig(cpid);
}
gettimeofday(&t_stop,NULL);
/* done */
sec = t_stop.tv_sec - t_start.tv_sec;
msec = (t_stop.tv_usec - t_start.tv_usec)/1000;
if(msec<0){
sec--;
msec=1000+msec;
}
printf("%d sec %d msec\n",sec,msec);
return;
}
void child_loop(pid_t ppid){
signal(SIGUSR1,shandler);
/* start */
while(!done){
pause_and_sendsig(ppid);
}
/* done */
return;
}
int main(){
pid_t ppid;
pid_t cpid;
ppid = getpid();
if(!(cpid = fork())){
child_loop(ppid);
exit(0);
}
else if(cpid<0){
perror("fork");
exit(1);
}
parent_loop(cpid);
usleep_overhead();
return 0;
}
signal送るのとselect()使うのと、どっちにしようかまよった。
テストプログラムを、signal使ってつくってみた。
/* wakeup with signal */
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/time.h>
#include <signal.h>
#include <unistd.h>
#define INTERVAL 500000 /* u sec */
#define LOOP 1000 /* times */
int done;
int count=0;
int done;
void shandler(int num);
void pause_and_sendsig(int pid);
void parent_loop(pid_t cpid);
void child_loop(pid_t ppid);
void usleep_overhead();
void shandler(int num){
count++;
if(count>LOOP){
done=1;
}
return;
}
void pause_and_sendsig(int pid){
pause();
usleep(INTERVAL/2);
/* sleep(1);*/
if(kill(pid,SIGUSR1)){
perror("kill");
}
return;
}
void usleep_overhead(){
struct timeval t_start;
struct timeval t_stop;
int sec;
int msec;
int i;
gettimeofday(&t_start,NULL);
for(i=0;i<LOOP*2;i++){
usleep(INTERVAL/2);
/* sleep(1);*/
}
gettimeofday(&t_stop,NULL);
/* done */
sec = t_stop.tv_sec - t_start.tv_sec;
msec = (t_stop.tv_usec - t_start.tv_usec)/1000;
if(msec<0){
sec--;
msec=1000+msec;
}
printf("%d sec %d msec\n",sec,msec);
return;
}
void parent_loop(pid_t cpid){
struct timeval t_start;
struct timeval t_stop;
int sec;
int msec;
signal(SIGUSR1,shandler);
/* wait child init */
sleep(2);
/* start */
gettimeofday(&t_start,NULL);
kill(cpid,SIGUSR1);
while(!done){
pause_and_sendsig(cpid);
}
gettimeofday(&t_stop,NULL);
/* done */
sec = t_stop.tv_sec - t_start.tv_sec;
msec = (t_stop.tv_usec - t_start.tv_usec)/1000;
if(msec<0){
sec--;
msec=1000+msec;
}
printf("%d sec %d msec\n",sec,msec);
return;
}
void child_loop(pid_t ppid){
signal(SIGUSR1,shandler);
/* start */
while(!done){
pause_and_sendsig(ppid);
}
/* done */
return;
}
int main(){
pid_t ppid;
pid_t cpid;
ppid = getpid();
if(!(cpid = fork())){
child_loop(ppid);
exit(0);
}
else if(cpid<0){
perror("fork");
exit(1);
}
parent_loop(cpid);
usleep_overhead();
return 0;
}