I want to generate a beep sound with a specific frequency and length (for different sound signals) using the system beeper (and only the speakers if beeper is not available / accessible). I know it is possible to do this by using ioctl, but that requires root access, which I don’t want.
I know I could just use the “beep” command, but that would be a dependency, which, if possible, shouldn’t be used (no external dependencies at all, just the basic linux libraries and C).
What I currently have is the following code (but this requires superuser privileges to run):
#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])));
}
If there is no other way to do this, then I will use beep, but I would really like to avoid dependencies and integrate the beep directly into my script, but I’m sure somebody here will know a solution / workaround.
I don’t really want external libraries as the program should be as lightweight as possible.
I think the only way to do this is to either use suid to give my own program root access, or to use
beep, which already has suid. I suppose I will just add one more dependency, then, asbeepis not too big anyway.Thank you for all the answers, I’m sure other libraries are great for more complex signals, but I need a very simple one!
I think this question can be marked as solved / closed, then.
If anybody finds a way to create a beep using the console without superuser-privileges, I’m still interested in this solution 🙂
Thank you all again.