Разработка приложений в среде 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);


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

Применение виртуальных машин дает различным категориям пользователей — от начинающих до 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.


Windows Vista. Мультимедийный курс

Эта книга поможет вам разобраться в премудростях операционной системы Windows Vista.Информационная насыщенность учебного материала позволяет утверждать, что мультимедийный курс будет интересен и новичкам, и опытным пользователям.


FAQ по смартфону Qtek 8300/8310

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Домашние и офисные сети под Vista и XP

Количество персональных компьютеров в нашей стране растет год от года. Сегодня во многих семьях имеется два или даже три компьютера.Чтобы воспользоваться всеми преимуществами такой ситуации, компьютеры в вашей квартире стоит объединить сетью. Это позволит вам играть по сети в компьютерные игры, совместно использовать дисковое пространство, принтеры, модемы и другие устройства, всю сеть можно соединить с Интернетом. А в офисах сеть между компьютерами просто необходима.Открывающиеся перспективы выглядят очень заманчиво.


Свободные программы и системы в школе

Курс лекций, включенных в брошюру, знакомит читателя с популярными свободными программами и системами, полезными при преподавании информатики в средней школе. В обзор вошли основы открытых операционных систем, сведения о пакете «офисных» программ OpenOffice.org, коммуникационном пакете Mozilla, графическом редакторе GIMP, современных графических средах GNOME и KDE и других программах.Для преподавателей информатики и методистов, а также для студентов и аспирантов соответствующих специальностей.© 2002-3, Максим Отставнов.© 2002, Андрей Добровольский (раздел 3.1).Использован текст лекций, публиковавшихся автором в приложении к газете «Первое сентября» «Информатика» (http://inf.1september.ru) в 2002-3 г., материалы брошюры «Прикладные свободные программы в школе» (М.: 2003 г.), а также фрагменты статей, ранее публиковавшихся в журналах «Компьютерра» и «Домашний компьютер».Материалы, представленные в этой книге, также доступны в Интернет на странице www.otstavnov.com/fsft на условиях Свободной лицензии ГНУ на документацию (GNU FDL)