パスワードを忘れた? アカウント作成
750788 journal

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;
}
typodupeerror

日々是ハック也 -- あるハードコアバイナリアン

読み込み中...