Разработка приложений в среде Linux. Второе издание
Шрифт:
265:
266: return 0;
267: }
268:
269: void removeJob(struct jobSet *jobList, struct job *job) {
270: struct job *prevJob;
271:
272: freeJob(job);
273: if (job == jobList->head) {
274: jobList->head=job->next;
275: } else {
276: prevJob = jobList->head;
277: while (prevJob->next != job) prevJob = prevJob->next;
278: prevJob->next=job->next;
279: }
280:
281: free(job);
282: }
283:
284: /*
Проверить, завершился ли какой-то из фоновых процессов -
285: если да, выяснить, почему и определить, завершилось ли задание */
286: void checkJobs(struct jobSet *jobList) {
287: struct job *job;
288: pid_t childpid;
289: int status;
290: int progNum;
291:
292: while ((childpid = waitpid(-1, &status, WNOHANG))>0) {
293: for (job = jobList->head;job;job = job->next) {
294: progNum = 0;
295: while (progNum<job->numProgs &&
296: job->progs[progNum].pid != childpid)
297: progNum++;
298: if (progNum<job->numProgs) break;
299: }
300:
301: job->runningProgs--;
302: job->progs[progNum].pid = 0;
303:
304: if (!job->runningProgs) {
305: printf(JOB_STATUS_FORMAT,job->jobId,"Готово",
306: job->text);
307: removeJob(jobList, job);
308: }
309: }
310:
311: if (childpid == -1 && errno!= ECHILD)
312: perror("waitpid");
313: }
314:
315: int main(int argc, const char **argv) {
316: char command [MAX_COMMAND_LEN + 1];
317: char *nextCommand = NULL;
318: struct jobSetjobList = {NULL, NULL};
319: struct jobnewJob;
320: FILE *input = stdin;
321: int i;
322: int status;
323: int inBg;
324:
325: if (argc>2) {
326: fprintf(stderr,"Непредвиденные
аргументы; использование: ladsh1 "
327: "<команды>\n");
328: exit(1);
329: } else if (argc == 2) {
330: input = fopen(argv[1], "r");
331: if (!input) {
332: perror("fopen");
333: exit(1);
334: }
335: }
336:
337: /* не обращать внимания на этот сигнал; он только вводит
338: в заблуждение и не имеет особого значения для оболочки */
339: signal(SIGTTOU, SIG_IGN);
340:
341: while(1) {
342: if (!jobList.fg) {
343: /* нет заданий переднего плана */
344:
345: /* проверить, завершились ли какие-то фоновые процессы */
346: checkJobs(&jobList);
347:
348: if (!nextCommand) {
349: if (getCommand(input, command)) break;
350: nextCommand=command;
351: }
352:
353: if (!parseCommand(&nextCommand, &newJob, &inBg) &&
354: newJob.numProgs) {
355: runCommand(newJob,&jobList,inBg);
356: }
357: } else {
358: /* задание выполняется на переднем плане; ждать завершения */
359: i = 0;
360: while (!jobList.fg->progs[i].pid) i++;
361:
362: waitpid(jobList.fg->progs[i].pid,&status,0);
363:
364: jobList.fg->runningProgs--;
365: jobList.fg->progs[i].pid=0;
366:
367: if (!jobList.fg->runningProgs) {
368: /* дочернее завершилось */
369:
370: removeJob(&jobList, jobList.fg);
371: jobList.fg = NULL;
372:
373: /* переместить оболочку на передний план */
Поделиться:
Популярные книги
На границе империй. Том 4
4. Фортуна дама переменчивая
Фантастика:
космическая фантастика
6.00
рейтинг книги
Имя нам Легион. Том 4
4. Меж двух миров
Фантастика:
боевая фантастика
рпг
аниме
5.00
рейтинг книги
Барон устанавливает правила
6. Закон сильного
Старинная литература:
прочая старинная литература
5.00
рейтинг книги
Начальник милиции. Книга 5
5. Начальник милиции
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Пенсия для морского дьявола
1. Первый в касте бездны
Фантастика:
попаданцы
5.29
рейтинг книги
Низший - Инфериор. Компиляция. Книги 1-19
Фантастика 2023. Компиляция
Фантастика:
боевая фантастика
5.00
рейтинг книги
Мастер 4
4. Мастер
Фантастика:
героическая фантастика
боевая фантастика
попаданцы
5.00
рейтинг книги
Студиозус
3. Светлая Тьма
Фантастика:
юмористическое фэнтези
городское фэнтези
аниме
5.00
рейтинг книги
Безумный Макс. Ротмистр Империи
2. Безумный Макс
Фантастика:
героическая фантастика
альтернативная история
4.67
рейтинг книги
Ветер перемен
5. Сын Петра
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
По дороге пряностей
2. Венецианский купец
Фантастика:
фэнтези
героическая фантастика
альтернативная история
5.50
рейтинг книги
Убивать чтобы жить 2
2. УЧЖ
Фантастика:
героическая фантастика
боевая фантастика
рпг
5.00
рейтинг книги
Решала
10. Девяностые
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Повелитель механического легиона. Том I
1. Повелитель механического легиона
Фантастика:
фэнтези
попаданцы
аниме
5.00