Linux ioctl VT_GETSTATE завершается ошибкой, если процесс запускается вручную

grep '^[^@#]' < file.in > file.out

даст вам строки, начинающиеся с любого символа, кроме @и #, поэтому эффективно удалите строки #foo, @foo, а также пустые строки.

grep -v '^[@#]' < file.in > file.out

сохранит пустые строки. Если вы хотите рассмотреть строки с пробелами перед @,#:

grep -v '^[[:blank:]]*[@#]' < file.in > file.out

А также убрать пустые строки:

grep '^[[:blank:]]*[^[:blank:]@#]' < file.in > file.out
1
09.10.2019, 17:59
1 ответ

Я подозреваю, что это происходит потому, что вы запускаете свою программу с терминала, который не является виртуальной консолью./dev/tty— специальное устройство, обеспечивающее доступ к управляющему терминалу , и это не обязательно виртуальная консоль; но используемый вами ioctlработает только на виртуальных консолях.

Ваша программа будет работать надежно, если вы убедитесь, что fdуказывает на виртуальную консоль , и самый простой способ сделать это при запуске от имени пользователя root — открыть /dev/tty0, что активная виртуальная консоль:

#include <stdio.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <linux/vt.h>

int main(int argc, char **argv) {
  long tty = -1;
  long fd = 0;
  int result = 0;
  struct vt_stat ttyinfo;

  fd = open("/dev/tty0", O_RDWR | O_NOCTTY);
  if (fd < 0) {
    perror("Error opening /dev/tty0");
    return 1;
  }
  result = ioctl(fd, VT_GETSTATE, &ttyinfo);
  if (result == 0) {
    tty = ttyinfo.v_active;
    printf("Active tty: %ld\n", tty);
  } else {
    perror("ioctl failed");
  }
}
3
27.01.2020, 23:22

Теги

Похожие вопросы