趣味の電子工作などの記録。時にLinuxへ行ったり、ガジェットに浮気したりするので、なかなかまとまらない。
RSS icon
  • 力技(fork)でブザーを鳴らす

    投稿日 2011年 5月 9日 コメントはありません

    コマンドラインからbeepコマンドでブザーを鳴らすことができたのですが、プログラムから鳴らす方法がわかりません。

    しかたがないので、サブプロセスを生成して、そこから system() でブザーを鳴らすという力技で鳴らすことにしました。

    先にサブプロセスが終了して何もしないでいると、サブプロセスがゾンビとして残ってしまいますので、次に鳴らす前に waitpid() で回収してます。これだと常にゾンビが1つ残ることになってしまいますので、もっといい方法があるのではないかと思うのですが、今回初めての fork() なのでこの辺で妥協します。

    #include <stdio.h>
    #include <signal.h>
    #include <string.h>
    #include <unistd.h>
    #include <sys/types.h>
    #include <sys/wait.h> 
    
    pid_t child_pid = 0;
    int child_sts;
    int buzzer(void)
    {
    	/* ゾンビ回収 */
    	if(child_pid > 0)waitpid(child_pid,&child_sts,WNOHANG);
    
    	/* 子プロセス生成 */
    	child_pid = fork();
    
    	if(child_pid==-1) {
    		/* fork()失敗 */
    		printf("fork failed.\n");
    	}
    	else if(child_pid==0) {
    		/* 子プロセス */
    		system("/usr/bin/beep -f 2000 -l 20");
    		_exit(0);
    	} else {
    		return(0);
    	}
    }
    
    int main(void)
    {
    	int i;
    	for(i=0;i<10;i++){
    		buzzer();
    		usleep(500000);
    	}
    }

    よく見ると、要らないヘッダを include してたりしますが、メモなのでこのままということで。


    コメントをどうぞ(日本語のみ/Only in Japanese)

    日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)