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

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

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

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

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