20.6. Пример команды open

20.6. Пример команды open

Ниже показан пример кода, выполняющий следующие задачи: поиск неиспользуемой VC, запуск на ней оболочки, ожидание завершения оболочки, переключение обратно, а также освобождение памяти, выделенной под VC, по завершении программы. Программа open, входящая в состав дистрибутива Linux, выполняет те же самые действия, но при этом она содержит больше опций и лучший контроль ошибок, таким образом, является более надежной. Хотя приведенная ниже версия тоже будет работать, ее трудно назвать удобной, надежной или безопасной.

 1: /* minopen.c */

 2:

 3: #include <stdio.h>

 4: #include <unistd.h>

 5: #include <stdlib.h>

 6: #include <signal.h>

 7: #include <fcntl.h>

 8: #include <sys/ioctl.h>

 9: #include <sys/vt.h>

10: #include <sys/stat.h>

11: #include <sys/types.h>

12: #include <sys/wait.h>

13:

14: int main (int argc, const char ** argv) {

15:  int vtnum;

16:  int vtfd;

17:  struct vt_stat vtstat;

18:  char device[32];

19:  int child;

20:

21:  vtfd = open("/dev/tty", O_RDWR, 0);

22:  if (vtfd < 0) {

23:   perror("minopen: не удается открыть /dev/tty");

24:   exit(1);

25:  }

26:  if (ioctl(vtfd, VT_GETSTATE, &vtstat) < 0) {

27:   perror("minopen: tty не является виртуальной консолью");

28:   exit(1);

29:  }

30:  if (ioctl(vtfd, VT_OPENQRY, &vtnum) < 0) {

31:   perror("minopen: нет свободных виртуальных консолей");

32:   exit(1);

33:  }

34:  sprintf(device, "/dev/tty%d", vtnum);

35:  if (access(device, (W_OK|R_OK)) < 0) {

36:   perror("minopen: недостаточные полномочия на tty");

37:   exit(1);

38:  }

39:  child = fork();

40:  if (child == 0) {

41:   ioctl(vtfd, VT_ACTIVATE, vtnum);

42:   ioctl(vtfd, VT_WAITACTIVE, vtnum);

43:   setsid();

44:   close(0); close(1); close(2);

45:   close(vtfd);

46:   vtfd = open(device, O_RDWR, 0); dup(vtfd); dup(vtfd);

47:   execlp("/bin/bash", "bash", NULL);

48:  }

49:  wait(&child);

50:  ioctl(vtfd, VT_ACTIVATE, vtstat.v_active);

51:  ioctl(vtfd, VT_WAITACTIVE, vtstat.v_active);

52:  ioctl(vtfd, VT_DISALLOCATE, vtnum);

53:  exit(0);

54: }

Поделитесь на страничке

Следующая глава >

Похожие главы из других книг

5.1 OPEN

Из книги Архитектура операционной системы UNIX автора Бах Морис Дж

5.1 OPEN Вызов системной функции open (открыть файл) — это первый шаг, который должен сделать процесс, чтобы обратиться к данным в файле. Синтаксис вызова функции open:fd = open(pathname, flags, modes);где pathname — имя файла, flags указывает режим открытия (например, для чтения или записи), а modes


10.1.2.1 Open

Из книги Искусство программирования на языке сценариев командной оболочки автора Купер Мендель

10.1.2.1 Open При открытии устройства ядро следует той же процедуре, что и при открытии файлов обычного типа (см. раздел 5.1), выделяя в памяти индексы, увеличивая значение счетчика ссылок и присваивая значение точки входа в таблицу файлов и пользовательского дескриптора файла.


Пример 7-2. Эквиваленты команды test -- /usr/bin/test, [ ], и /usr/bin/[

Из книги Операционная система UNIX автора Робачевский Андрей М.

Пример 7-2. Эквиваленты команды test -- /usr/bin/test, [ ], и /usr/bin/[ #!/bin/bashechoif test -z "$1"then echo "Аргументы командной строки отсутствуют."else echo "Первый аргумент командной строки: $1."fiechoif /usr/bin/test -z "$1" # Дает тот же рузультат, что и встроенная команда "test".then echo "Аргументы командной строки


Пример 9-4. Ограничение времени ожидания команды read

Из книги Linux и UNIX: программирование в shell. Руководство разработчика. автора Тейнсли Дэвид

Пример 9-4. Ограничение времени ожидания команды read #!/bin/bash# t-out.sh TIMELIMIT=4 # 4 секундыread -t $TIMELIMIT variable <&1echoif [ -z "$variable" ]then echo "Время ожидания истекло."else echo "variable = $variable"fi exit 0$UIDuser id numberUID (идентификатор) текущего пользователя, в соответствии с /etc/passwdЭто реальный UID текущего


Пример 11-9. Демонстрация команды eval

Из книги Linux Mint и его Cinnamon. Очерки применителя автора Федорчук Алексей Викторович

Пример 11-9. Демонстрация команды eval #!/bin/bashy=`eval ls -l` # Подобно y=`ls -l`echo $y # но символы перевода строки не выводятся, поскольку имя переменной не в кавычках.echoecho "$y" # Если имя переменной записать в кавычках -- символы перевода строки сохраняются.echo; echoy=`eval df` # Аналогично


Пример 11-23. Сценарий, завершающий себя сам с помощью команды kill

Из книги автора

Пример 11-23. Сценарий, завершающий себя сам с помощью команды kill #!/bin/bash# self-destruct.shkill $$ # Сценарий завершает себя сам. # Надеюсь вы еще не забыли, что "$$" -- это PID сценария.echo "Эта строка никогда не будет выведена."# Вместо него на stdout будет выведено сообщение "Terminated".exit 0# Какой


Пример 12-1. Создание оглавления диска для записи CDR, с помощью команды ls

Из книги автора

Пример 12-1. Создание оглавления диска для записи CDR, с помощью команды ls #!/bin/bash# burn-cd.sh# Сценарий, автоматизирующий процесс прожигания CDR.SPEED=2 # Если ваше "железо" поддерживает более высокую скорость записи -- можете увеличить этот параметрIMAGEFILE=cdimage.isoCONTENTSFILE=contentsDEFAULTDIR=/opt #


Пример 12-4. Использование команды xargs для мониторинга системного журнала

Из книги автора

Пример 12-4. Использование команды xargs для мониторинга системного журнала #!/bin/bash# Создание временного файла мониторинга в текщем каталоге,# куда переписываются несколько последних строк из /var/log/messages.# Обратите внимание: если сценарий запускается обычным пользователем,# то


Пример 16-3. Одновременное перенаправление устройств, stdin и stdout, с помощью команды exec

Из книги автора

Пример 16-3. Одновременное перенаправление устройств, stdin и stdout, с помощью команды exec #!/bin/bash# upperconv.sh# Преобразование символов во входном файле в верхний регистр.E_FILE_ACCESS=70E_WRONG_ARGS=71if [ ! -r "$1" ] # Файл доступен для чтения?then echo "Невозможно прочитать из заданного файла!" echo


X/Open

Из книги автора

X/Open В 1984 году ряд европейских компьютерных компаний сформировал некоммерческую организацию, получившую название X/Open. Название полностью отражает цель этой организации — разработку общего набора интерфейсов операционной системы, согласованного между различными


Функция open(2)

Из книги автора

Функция open(2) Открывает указанный файл для чтения или записи и имеет следующий вид:#include <fcntl.h>int open(const char *path, int oflag, mode_t mode);Первый аргумент (path) является указателем на имя файла. Это имя может быть как абсолютным (начинающимся с корневого каталога /), так и относительным


1.7.1. Пример использования команды chown

Из книги автора

1.7.1. Пример использования команды chown Вот как можно поменять владельца файла с помощью команды chown:$ ls -l-rwxrwxrwx 1 louise admin 345 Sep 20 14:33 project$ chown pauline project $ ls -l-rwxrwxrwx 1 pauline admin 345 Sep 20 14:33 projectПраво владения файлом project переходит от пользователя louise к


1.7.2. Пример использования команды chgrp

Из книги автора

1.7.2. Пример использования команды chgrp Следующий пример демонстрирует, как поменять группу, которой принадлежит файл:$ ls -1-rwxrwxrwx 1 pauline admin 345 Sep 20 14:33 project$ chgrp sysadmin project $ ls -1-rwxrwxrwx 1 pauline sysadmin 345 Sep 20 14:33 projectПользователь pauline передал группе sysadmin право владения файлом project, которое до


Пример: опции команды ls

Из книги автора

Пример: опции команды ls Опции определяют условия выполнения команды. На предыдущей странице был приведён пример команды ls без опций. Однако на самом деле отсутствием опций при ней определяется вид выводимого списка по умолчанию — как многоколочночного списка,