Вход/Регистрация
Разработка приложений в среде Linux. Второе издание
вернуться

Троан Эрик В.

Шрифт:

 20:

 21: struct jobSet {

 22: struct job * head; /* заголовок списка выполняющихся заданий */

 23: struct job * fg; /* текущее высокоприоритетное задание */

 24: };

 25:

 26: enum redirectionType { REDIRECT_INPUT, REDIRECT_OVERWRITE,

 27: REDIRECT_APPEND };

 28:

 29: struct redirectionSpecifier {

 30: enum redirectionType type; /* тип переадресации */

 31: int fd; /* переадресация fd */

 32: char * filename; /* файл, в который будет переадресовано fd */

 33: };

 34:

 35: struct childProgram {

 36: pid_t pid; /* 0 в случае выхода */

 37: char ** argv; /* имя программы и аргументы */

 38: int numRedirections; /* элементы в массиве переадресации */

 39: struct redirectionSpecifier* redirections; /* переадресации ввода-вывода */

 40: glob_t globResult; /* результат универсализации параметра */

 41: int freeGlob; /* нужно ли освобождать globResult? */

 42: int isStopped; /* выполняется ли в данный момент программа?*/

 43: };

 44:

 45: struct job {

 46: int jobId; /* номер задания */

 47: int numProgs; /* количество программ в задании */

 48: int runningProgs; /* количество выполняющихся программ */

 49: char * text; /* имя задания */

 50: char * cmdBuf; /* буфер, на который ссылаются различные массивы argv */

 51: pid_t pgrp; /* идентификатор группы процесса для задания */

 52: struct childProgram* progs; /* массив программ в задании */

 53: struct job* next; /* для отслеживания фоновых команд */

 54: int stoppedProgs; /* количество активных, но приостановленных программ */

 55: };

 56:

 57: void freeJob (struct job * cmd) {

 58: int i;

 59:

 60: for (i = 0; i <cmd->numProgs; i++) {

 61: free(cmd->progs[i].argv);

 62: if (cmd->progs[i].redirections)

 63: free(cmd->progs[i].redirections);

 64: if (cmd->progs[i].freeGlob)

 65: globfree(&cmd->progs[i].globResult);

 66: }

 67: free(cmd->progs);

 68: if (cmd->text) free(cmd->text);

 69: free(cmd->cmdBuf);

 70: }

 71:

 72: int getCommand(FILE * source, char * command) {

 73: if (source == stdin) {

 74: printf("# ");

 75: fflush(stdout);

 76: }

 77:

 78: if (!fgets(command, MAX_COMMAND_LEN, source)) {

 79: if (source == stdin) printf("\n");

 80: return 1;

 81: }

 82:

 83: /* удаление хвостового символа новой строки */

 84: command[strlen(command) - 1] = '\0';

 85:

 86: return 0;

 87: }

 88:

 89: void globLastArgument(struct childProgram * prog, int * argcPtr,

 90: int * argcAllocedPtr) {

 91: int argc = *argcPtr;

 92: int argcAlloced = *argcAllocedPtr;

  • Читать дальше
  • 1
  • ...
  • 233
  • 234
  • 235
  • 236
  • 237
  • 238
  • 239
  • 240
  • 241
  • 242
  • 243
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: