2012-04-09 8 views
9

시스템 비퍼를 사용하여 특정 주파수 및 길이 (다른 소리 신호의 경우)로 신호음을 생성하고 싶습니다 (신호음을 사용할 수 없거나 액세스 할 수없는 경우 스피커 만). ioctl을 사용하여이 작업을 수행 할 수 있음을 알고 있지만 루트 액세스가 필요합니다. 원하지 않습니다.C의 Linux에서 경고음

나는 "삑"명령을 사용할 수 있지만, 가능하다면 사용해서는 안된다. (외부 의존성이 없다. 기본 리눅스 라이브러리와 C 만).

는 내가 현재 가지고하면 다음과 같은 코드 (그러나 이것은 실행하려면 수퍼 유저 권한이 필요) :이 작업을 수행하는 다른 방법이없는 경우

#include <stdlib.h> 
#include <fcntl.h> 
#include <linux/kd.h> 

int main(int argc, char *argv[]) 
{ 
int fd = open("/dev/console", O_RDONLY); 
if (fd == -1 || argc != 3) return -1; 
return ioctl(fd, KDMKTONE, (atoi(argv[2])<<16)+(1193180/atoi(argv[1]))); 
} 

, 그때 경고음을 사용하지만, 난 정말 싶습니다 의존성을 피하고 경고음을 내 스크립트에 직접 통합 할 수는 있지만 여기 누군가가 해결책/해결 방법을 알 것입니다.

나는 프로그램이 가능한 한 가볍기 때문에 외부 라이브러리를 정말로 원하지 않는다.

+0

바탕 화면에서 실행중인 경우 ALSA를 사용할 수 있습니다. 그리고 당신은 또한'play' 명령을 사용할 수 있습니다 ... 그리고 몇몇 데스크탑은 통지를 가지고 있습니다 ... –

+0

@BasileStarynkevitch 그렇게 복잡하지 않습니까? 나는 단지 특정한 주파수와 길이의 단순한 삐음을 원한다. 이미 파블로에게 말했듯이 가능한 한 가볍게 유지하고 싶지만 루트 액세스 권한을 얻으려면 경고음이나 suid를 사용하는 것이 좋습니다. – omnidan

+0

[this] (http://stackoverflow.com/questions/412789/windows-beep-equivalent-for-linux)가 도움이되는지 확인하십시오. @paxdiablo는 사용자 계정에서도 실행할 수 있다고 주장합니다. –

답변

3

이 방법을 사용하는 유일한 방법은 suid를 사용하여 내 프로그램 루트 액세스 권한을 부여하거나 이미 suid가있는 beep을 사용하는 것입니다. 어쨌든 beep이 너무 크지 않으므로 종속성을 하나 더 추가한다고 가정합니다.

모든 답변을 주셔서 감사합니다. 다른 라이브러리는 더 복잡한 신호에 유용 할 것이라고 확신합니다. 그러나 아주 간단한 것이 필요합니다!

이 질문은 해결되었거나 닫힌 것으로 표시 될 수 있다고 생각합니다. 사람이 슈퍼 유저 권한이없는 콘솔을 사용하여 경고음을 만들 수있는 방법을 발견하면

, 나는 아직이 솔루션 :

다시 여러분 모두 감사에 관심이 있어요.

0

OpenAL과 같은 오디오 라이브러리를 사용해보세요.

+0

가능한 한 경량으로 프로그램을 유지하고 싶습니다. – omnidan

+0

그런 다음 출력 만하면됩니다. 벨 문자'\ a'를 사용하고 소리를 터미널 에뮬레이터에 남겨 둡니다. 물론, 당신은 그 소리의 피치와 음색을 바꿀 수 없습니다 ... –

+0

@BasileStarynkevitch 물론, 가능 합니다만, 특정 주파수가 신호를 약간 다르게하고 싶습니다. – omnidan

2

단말기가 지원하는 경우 가장 기본적인 경고음, '\ a를'여전히 :

fprintf(stdout, "\aBeep!\n"); 
+0

그래,하지만 그건 하나의 주파수 일 뿐이야. – omnidan

+0

나는 그것이 기본이라고 말했다. 유감스럽게 생각한다. (나중에이 페이지를 방문한 사람들에게 반응은 여전히 ​​유용 할 것이다.) – wildplasser

+0

출력이 리다이렉트되면 잘 작동하지 않는다. –

4

표준 리눅스 beep 소스 코드를보고하십시오. http://www.johnath.com/beep/beep.c

KIOCSOUND ioctl을 사용하여 "삐"하지만 슈퍼 유저 권한이 필요하지 않습니다. "삐"그룹에서 사용자가 읽을 수 있고 실행 가능하도록 구성했습니다.

따라서 UID 1000을 사용하는 표준 사용자는 GID 501 ("신호음"이라고 함) 그룹에 속합니다. 다음으로 나는 chmod 4750 /usr/bin/beep을 가지고 있었고 지금은 수퍼 유저 권한을 요구하지 않고 (20-20000Hz 범위 내에서) 삐 소리를 낼 수 있습니다.