Разработка приложений в среде Linux - [207]

Шрифт
Интервал

> 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 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;

> 93:  int rc;

> 94:  int flags;

> 95:  int i;

> 96:  char * src, * dst;

> 98:  if (argc>1) { /* cmd->globResult уже инициализирован */

> 99:   flags = GLOB_APPEND;

>100:   i = prog->globResult.gl_pathc;

>101:  } else {

>102:   prog->freeGlob = 1;

>103:   flags = 0;

>104:   i = 0;

>105:  }

>106:

>107:  rc = glob(prog->argv[argc - 1], flags, NULL, &prog->globResult);

>108:  if (rc == GLOB_NOSPACE) {

>109:   fprintf(stderr, "недостаточно пространства для универсализации\n");

>110:   return;

>111:  } else if (rc == GLOB_NOMATCH ||

>112:   (!rc && (prog->globResult.gl_pathc - i) == 1 &&

>113:   !strcmp(prog->argv[argc - 1],

>114:   prog->globResult.gl_pathv[i]))) {

>115:   /* нам нужно удалить все, что до сих пор было заключено между \ */

>116:   src = dst = prog->argv[argc - 1];

>117:   while (*src) {

>118:    if (*src != '\\') *dst++ = *src;

>119:    src++;

>120:   }

>121:   *dst = '\0';

>122:  } else if (!rc) {

>123:   argcAlloced += (prog->globResult.gl_pathc - i);

>124:   prog->argv = realloc(prog->argv,

>125:   argcAlloced * sizeof(*prog->argv));

>126:   memcpy(prog->argv + (argc - 1),

>127:   prog->globResult.gl_pathv + i,

>128:   sizeof(*(prog->argv)) *

>129:    (prog->globResult.gl_pathc - i));

>130:   argc += (prog->globResult.gl_pathc - i - 1);

>131:  }

>132:

>133:  *argcAllocedPtr = argcAlloced;

>134:  *argcPtr = argc;

>135: }

>136:

>137: /* Возвращаем cmd->numProgs как 0, если не представлено ни одной команды

>138:    (например, пустая строка). Если будет обнаружена допустимая команда,

>139:    commandPtr будет ссылаться на начало следующей команды (если исходная

>140:    команда была связана с несколькими заданиями) или будет равно NULL,

>141:    если больше не представлено ни одной команды. */

>142: int parseCommand(char ** commandPtr, struct job * job, int * isBg) {

>143:  char * command;

>144:  char * returnCommand = NULL;

>145:  char * src, * buf, * chptr;

>146:  int argc = 0;

>147:  int done = 0;

>148:  int argvAlloced;

>149:  int i;

>150:  char quote = '\0';

>151:  int count;

>152:  struct childProgram * prog;

>153:

>154:  /* пропускаем первое свободное место (например, пробел) */

>155:  while (**commandPtr && isspace(**commandPtr)) (*commandPtr)++;

>156:

>157:  /* обрабатываем пустые строки и первые символы '#' */

>158:  if (!**commandPtr || (**commandPtr=='#')) {

>159:   job->numProgs = 0;

>160:   *commandPtr = NULL;

>161:   return 0;

>162:  }

>163:

>164:  *isBg = 0;

>165:  job->numProgs = 1;

>166:  job->progs = malloc(sizeof(*job->progs));

>167:

>168:  /* Мы задаем элементы массива argv для ссылки внутри строки.

>169:     Освобождение памяти осуществляется с помощью функции freeJob().

>170:

>171:     Получив незанятую память, нам не нужно будет использовать завершающие

>172:     значения NULL, поэтому оставшаяся часть будет выглядеть аккуратнее

>173:     (хотя, честно говоря, менее эффективно). */

>174:  job->cmdBuf = command = calloc(1, strlen(*commandPtr) + 1);


Рекомендуем почитать
Это ваше Fido

Одно из немногих изданий на русском языке, которое посвящено старейшей глобальной компьютерной сети "Fidonet". Сатирический справочник о жизни и смерти самого древнего сетевого сообщества, которое до сих пор существует среди нас.


Безопасность информационных систем

В пособии излагаются основные тенденции развития организационного обеспечения безопасности информационных систем, а также подходы к анализу информационной инфраструктуры организационных систем и решению задач обеспечения безопасности компьютерных систем.Для студентов по направлению подготовки 230400 – Информационные системы и технологии (квалификация «бакалавр»).


UNIX — универсальная среда программирования

В книге американских авторов — разработчиков операционной системы UNIX — блестяще решена проблема автоматизации деятельности программиста, системной поддержки его творчества, выходящей за рамки языков программирования. Профессионалам открыт богатый "встроенный" арсенал системы UNIX. Многочисленными примерами иллюстрировано использование языка управления заданиями shell.Для программистов-пользователей операционной системы UNIX.


QNX/UNIX: Анатомия параллелизма

Книга адресована программистам, работающим в самых разнообразных ОС UNIX. Авторы предлагают шире взглянуть на возможности параллельной организации вычислительного процесса в традиционном программировании. Особый акцент делается на потоках (threads), а именно на тех возможностях и сложностях, которые были привнесены в технику параллельных вычислений этой относительно новой парадигмой программирования. На примерах реальных кодов показываются приемы и преимущества параллельной организации вычислительного процесса.


Виртуальные  машины: несколько компьютеров в  одном

Применение виртуальных машин дает различным категориям пользователей — от начинающих до IT-специалистов — множество преимуществ. Это и повышенная безопасность работы, и простота развертывания новых платформ, и снижение стоимости владения. И потому не случайно сегодня виртуальные машины переживают второе рождение.В книге рассмотрены три наиболее популярных на сегодняшний день инструмента, предназначенных для создания виртуальных машин и управления ими: Virtual PC 2004 компании Microsoft, VMware Workstation от компании VMware и относительно «свежий» продукт — Parallels Workstation, созданный в компании Parallels.


Недокументированные и малоизвестные возможности Windows XP

Книга содержит подробные сведения о таких недокументированных или малоизвестных возможностях Windows XP, как принципы работы с программами rundll32.exe и regsvr32.exe, написание скриптов сервера сценариев Windows и создание INF-файлов. В ней приведено описание оснасток, изложены принципы работы с консолью управления mmc.exe и параметрами реестра, которые изменяются с ее помощью. Кроме того, рассмотрено большое количество средств, позволяющих выполнить тонкую настройку Windows XP.Эта книга предназначена для опытных пользователей и администраторов, которым интересно узнать о нестандартных возможностях Windows.