Seu problema é que você tenta inserir o código C em um prompt do shell, isso não funciona por razões óbvias. Você poderia colocá-lo em um arquivo C correto, compilá-lo e obter um binário válido que você poderia executar:
#include <linux/kd.h>
#include <sys/ioctl.h>
#include <fcntl.h>
#include <unistd.h>
#include <err.h>
#include <stdio.h>
#include <stdlib.h>
static void
usage(char *argv0)
{
fprintf(stderr, "Usage: %s <on|off>\n", argv0);
exit(EXIT_FAILURE);
}
int
main(int argc, char *argv[])
{
int fd;
int on;
unsigned char state;
if (argc != 2)
usage(argv[0]);
if (strcmp(argv[1], "on") == 0)
on = 1;
else if(strcmp(argv[1], "off") == 0)
on = 0;
else
usage(argv[0]);
fd = open("/dev/console", O_RDWR);
if (fd == -1)
err(EXIT_FAILURE, "open /dev/console");
if (ioctl(fd, KDGETLED, &state) == -1)
err(EXIT_FAILURE, "KDGETLED");
if (on)
state |= LED_CAP;
else
state &= ~LED_CAP;
if (ioctl(fd, KDSETLED, state) == -1)
err(EXIT_FAILURE, "KDSETLED");
close(fd);
return 0;
}
Coloque isso em um arquivo chamado, por exemplo caps.c
e compila:
$ gcc -o caps caps.c
Então você pode executá-lo como
$ ./caps on
para ligar o LED ou
$ ./caps off
para desligá-lo (alternar é deixado como um exercício para o leitor).
Observação: para abrir /dev/console
, você precisará de direitos de superusuário.
Ainda outra nota: Isso também não impede que seu terminal ou servidor X altere o LED CapsLock ocasionalmente (por exemplo, quando