История изменений
Исправление theNamelessOne, (текущая версия) :
Читай ман CONSOLE_IOCTL(4): KDSETLED/KDGETLED включает/получает состояние светодиодов, а KDSKBLED/KDGKBLED включает/получает состояние соответствующих клавиатурных флагов. Т.е если тебе нужно лишь мигать светодиодами, а не писать капсом, то ты используешь связку KDSETLED/KDGETLED, в противном случае — связку KDSKBLED/KDGKBLED. Смешивать эти вызовы не стоит.
Вот такой код у меня работает:
#include <fcntl.h>
#include <sys/ioctl.h>
#include <sys/kd.h>
#include <sys/stat.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
char get_led() {
  char arg;
  int fd = open("/dev/console", O_RDONLY);
  if (fd == -1) {
    perror("open");
    exit(1);
  }
  if (ioctl(fd, KDGETLED, &arg) == -1) {
    perror("ioctl");
    exit(1);
  }
  if (close(fd) == -1) {
    perror("close");
    exit(1);
  }
  return arg;
}
void set_led(char arg) {
  int fd = open("/dev/console", O_WRONLY);
  if (fd == -1) {
    perror("open");
    exit(1);
  }
  if (ioctl(fd, KDSETLED, arg) == -1) {
    perror("ioctl");
    exit(1);
  }
  if (close(fd) == -1) {
    perror("close");
    exit(1);
  }
}
void print_led(char arg) {
  printf("  CAPS is %s\n", arg & LED_CAP ? "on" : "off");
  printf("  NUM is %s\n", arg & LED_NUM ? "on" : "off");
  printf("  SCROLL is %s\n", arg & LED_SCR ? "on" : "off");
}
int main(void) {
  char led;
  puts("Before setting LEDs");
  led = get_led();
  printf("Current state (%#x):\n", led);
  print_led(led);
  char old_led = led;
  /* Turn on all LEDs */
  set_led(0x7);
  puts("\nAfter setting LEDs");
  led = get_led();
  printf("Current state (%#x):\n", led);
  print_led(led);
  /* Restore LED state */
  set_led(old_led);
  return 0;
}
Результат:
λ nameless@desktop /tmp → sudo ./led
Before setting LEDs
Current state (0x2):
  CAPS is off
  NUM is on
  SCROLL is off
After setting LEDs
Current state (0x7):
  CAPS is on
  NUM is on
  SCROLL is on
λ nameless@desktop /tmp →Исправление theNamelessOne, :
Читай ман: KDSETLED/KDGETLED включает/получает состояние светодиодов, а KDSKBLED/KDGKBLED включает/получает состояние соответствующих клавиатурных флагов. Т.е если тебе нужно лишь мигать светодиодами, а не писать капсом, то ты используешь связку KDSETLED/KDGETLED, в противном случае — связку KDSKBLED/KDGKBLED. Смешивать эти вызовы не стоит.
Вот такой код у меня работает:
#include <fcntl.h>
#include <sys/ioctl.h>
#include <sys/kd.h>
#include <sys/stat.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
char get_led() {
  char arg;
  int fd = open("/dev/console", O_RDONLY);
  if (fd == -1) {
    perror("open");
    exit(1);
  }
  if (ioctl(fd, KDGETLED, &arg) == -1) {
    perror("ioctl");
    exit(1);
  }
  if (close(fd) == -1) {
    perror("close");
    exit(1);
  }
  return arg;
}
void set_led(char arg) {
  int fd = open("/dev/console", O_WRONLY);
  if (fd == -1) {
    perror("open");
    exit(1);
  }
  if (ioctl(fd, KDSETLED, arg) == -1) {
    perror("ioctl");
    exit(1);
  }
  if (close(fd) == -1) {
    perror("close");
    exit(1);
  }
}
void print_led(char arg) {
  printf("  CAPS is %s\n", arg & LED_CAP ? "on" : "off");
  printf("  NUM is %s\n", arg & LED_NUM ? "on" : "off");
  printf("  SCROLL is %s\n", arg & LED_SCR ? "on" : "off");
}
int main(void) {
  char led;
  puts("Before setting LEDs");
  led = get_led();
  printf("Current state (%#x):\n", led);
  print_led(led);
  char old_led = led;
  /* Turn on all LEDs */
  set_led(0x7);
  puts("\nAfter setting LEDs");
  led = get_led();
  printf("Current state (%#x):\n", led);
  print_led(led);
  /* Restore LED state */
  set_led(old_led);
  return 0;
}
Результат:
λ nameless@desktop /tmp → sudo ./led
Before setting LEDs
Current state (0x2):
  CAPS is off
  NUM is on
  SCROLL is off
After setting LEDs
Current state (0x7):
  CAPS is on
  NUM is on
  SCROLL is on
λ nameless@desktop /tmp →Исходная версия theNamelessOne, :
Читай ман: KDSETLED/KDGETLED включает/получает состояние светодиодов, а KDSKBLED/KDGKBLED включает/получает состояние соответствующих клавиатурных флагов. Т.е если тебе нужно лишь мигать светодиодами, а не писать капсом, то ты используешь связку KDSETLED/KDGETLED, в противном случае — связку KDSKBLED/KDGKBLED. Смешивать эти вызовы не стоит.
Вот такой код у меня работает:
#include <fcntl.h>
#include <sys/ioctl.h>
#include <sys/kd.h>
#include <sys/stat.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
char get_led() {
  char arg;
  int fd = open("/dev/console", O_RDONLY);
  if (fd == -1) {
    perror("open");
    exit(1);
  }
  if (ioctl(fd, KDGETLED, &arg) == -1) {
    perror("ioctl");
    exit(1);
  }
  if (close(fd) == -1) {
    perror("close");
    exit(1);
  }
  return arg;
}
void set_led(char arg) {
  int fd = open("/dev/console", O_WRONLY);
  if (fd == -1) {
    perror("open");
    exit(1);
  }
  if (ioctl(fd, KDSETLED, arg) == -1) {
    perror("ioctl");
    exit(1);
  }
  if (close(fd) == -1) {
    perror("close");
    exit(1);
  }
}
void print_led(char arg) {
  printf("  CAPS is %s\n", arg & LED_CAP ? "on" : "off");
  printf("  NUM is %s\n", arg & LED_NUM ? "on" : "off");
  printf("  SCROLL is %s\n", arg & LED_SCR ? "on" : "off");
}
int main(void) {
  char led;
  puts("Before setting LEDs");
  led = get_led();
  printf("Current state (%#x):\n", led);
  print_led(led);
  char old_led = led;
  /* Turn on all LEDs */
  set_led(0x7);
  puts("\nAfter setting LEDs");
  led = get_led();
  printf("Current state (%#x):\n", led);
  print_led(led);
  /* Restore LED state */
  set_led(old_led);
  return 0;
}