力技(fork)でブザーを鳴らす

コマンドラインから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 してたりしますが、メモなのでこのままということで。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

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