Чтение онлайн

на главную - закладки

Жанры

Разработка приложений в среде Linux. Второе издание

Троан Эрик В.

Шрифт:

155: case ';': /* множественные команды */

156: done=1;

157: return Command = *commandPtr + (src - *commandPtr) + 1;

158: break;

159:

160: case '\\' :

161: src++;

162: if (!*src) {

163: freeJob(job);

164: fprintf(stderr, "ожидается символ после \\\n");

165: return 1;

166: }

167: /*
двигаться дальше */

168: default:

169: *buf++=*src;

170: }

171:

172: src++;

173: }

174:

175: if (*prog->argv[argc]) {

176: argc++;

177: }

178: if (!argc) {

179: freeJob(job);

180: return 0;

181: }

182: prog->argv[argc]=NULL;

183:

184: if (!returnCommand) {

185: job->text = malloc(strlen(*commandPtr) + 1);

186: strcpy(job->text,*commandPtr);

187: } else {

188: /* Это оставляет хвостовые пробелы, что несколько излишне */

189:

190: count = returnCommand - *commandPtr;

191: job->text = malloc(count + 1);

192: strncpy(job->text,*commandPtr,count);

193: job->text[count] = '\0';

194: }

195:

196: *commandPtr = returnCommand;

197:

198: return 0;

199: }

200:

201: int runCommand(struct jobnewJob, struct jobSet *jobList,

202: intinBg) {

203: struct job *job;

204:

205: /* обходной путь "вручную" - мы не используем fork,

206: поэтому не можем легко реализовать фоновый режим */

207: if (!strcmp(newJob.progs[0].argv[0], "exit")) {

208: /* это должно вернуть реальный код возврата */

209: exit(0);

210: } else if(!strcmp(newJob.progs[0].argv[0], "jobs")) {

211: for (job = jobList->head; job; job = job->next)

212: printf(JOB_STATUS_FORMAT, job->jobId, "Работаю",

213: job->text);

214: return 0;

215: }

216:

217: /*
у нас пока только одна программа на дочернее задание,

218: потому это просто */

219: if (!(newJob.progs[0].pid = fork)) {

220: execvp(newJob.progs[0].argv[0],newJob.progs[0].argv);

221: fprintf(stderr, "exec для %s потерпела неудачу: %s\n",

222: newJob.progs[0].argv[0],

223: strerror(errno));

224: exit(1);

225: }

226:

227: /* поместить дочернюю программу в отдельную группу процессов */

228: setpgid(newJob.progs[0].pid,newJob.progs[0].pid);

229:

230: newJob.pgrp = newJob.progs[0].pid;

231:

232: /* найти идентификатор для задания */

233: newJob.jobld = 1;

234: for (job = jobList->head; job; job = job->next)

235: if (job->jobId >= newJob.jobId)

236: newJob.jobId = job->jobId+1;

237:

238: /* задание для списка заданий */

239: if (!jobList->head) {

240: job = jobList->head = malloc(sizeof(*job));

241: } else {

242: for (job = jobList->head; job->next; job = job->next);

243: job->next = malloc(sizeof(*job));

244: job = job->next;

245: }

246:

247: *job = newJob;

248: job->next = NULL;

249: job->runningProgs = job->numProgs;

250:

251: if (inBg) {

252: /* мы не ждем завершения фоновых заданий - добавить

253: в список фоновых заданий и оставить в покое */

254:

255: printf("[%d]%d\n", job->jobId,

256: newJob.progs[newJob.numProgs-1].pid);

257: } else {

258: jobList->fg=job;

259:

260: /* переместить новую группу процессов на передний план */

261:

262: if (tcsetpgrp(0,newJob.pgrp))

263: perror("tcsetpgrp");

264: }

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

Усадьба леди Анны

Ром Полина
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Усадьба леди Анны

Чужая дочь

Зика Натаэль
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Чужая дочь

Светлая тьма. Советник

Шмаков Алексей Семенович
6. Светлая Тьма
Фантастика:
юмористическое фэнтези
городское фэнтези
аниме
сказочная фантастика
фэнтези
5.00
рейтинг книги
Светлая тьма. Советник

Двойник Короля

Скабер Артемий
1. Двойник Короля
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Двойник Короля

Его нежеланная истинная

Кушкина Милена
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Его нежеланная истинная

Последний Паладин. Том 2

Саваровский Роман
2. Путь Паладина
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Последний Паладин. Том 2

Измена. Наследник для дракона

Солт Елена
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Измена. Наследник для дракона

Идеальный мир для Лекаря 9

Сапфир Олег
9. Лекарь
Фантастика:
боевая фантастика
юмористическое фэнтези
6.00
рейтинг книги
Идеальный мир для Лекаря 9

Мастер темных Арканов

Карелин Сергей Витальевич
1. Мастер темных арканов
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Мастер темных Арканов

Адвокат империи

Карелин Сергей Витальевич
1. Адвокат империи
Фантастика:
городское фэнтези
попаданцы
фэнтези
5.75
рейтинг книги
Адвокат империи

Кодекс Охотника. Книга XXI

Винокуров Юрий
21. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Охотника. Книга XXI

Вечный. Книга II

Рокотов Алексей
2. Вечный
Фантастика:
боевая фантастика
попаданцы
рпг
5.00
рейтинг книги
Вечный. Книга II

Законы Рода. Том 3

Flow Ascold
3. Граф Берестьев
Фантастика:
фэнтези
аниме
5.00
рейтинг книги
Законы Рода. Том 3

Наследник

Шимохин Дмитрий
1. Старицкий
Приключения:
исторические приключения
5.00
рейтинг книги
Наследник