Вход/Регистрация
Разработка приложений в среде Linux. Второе издание
вернуться

Троан Эрик В.

Шрифт:

518:

519: close(controlfds[1]);

520: /* при чтении будет возвращен 0, когда записывающая сторона закрыта */

521: read(controlfds[0], &len, 1);

522: close(controlfds[0]);

523:

524: if (nextin != 0) {

525: dup2(nextin, 0);

526: close(nextin);

527: }

528:

529: if (nextout != 1) {

530: dup2(nextout, 1);

531: close(nextout);

532: }

533:

534: /* явные переадресации подменяют каналы */

535: setupRedirections(newJob.progs + i);

536:

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

538: fprintf(stderr, "сбой exec для %s: %s\n",

539: newJob.progs[i].argv[0],

540: strerror(errno));

541: exit(1);

542: }

543:

544: /* помещаем дочерний процесс в группу процессов, лидером в которой

545: является первый процесс в этом канале */

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

547:

548: /* закрываем канал управления, чтобы продолжить работу дочернего процесса */

549: close(controlfds[0]);

550: close(controlfds[1]);

551:

552: if (nextin !=0) close(nextin);

553: if (nextout !=1) close(nextout);

554:

555: /* Если другого процесса нет, то nextin является "мусором",

556: хотя это и не является помехой */

557: nextin = pipefds[0];

558: }

559:

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

561:

562: /* поиск идентификатора используемого задания */

563: newJob.jobld = 1;

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

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

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

567:

568: /* добавляем задание в список выполняющихся заданий */

569: if (!jobList->head) {

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

571: } else {

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

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

574: job = job->next;

575: }

576:

577: *job = newJob;

578: job->next = NULL;

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

580: job->stoppedProgs = 0;

581:

582: if (inBg) {

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

584: в список фоновых заданий и оставляем их */

585:

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

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

588: } else {

589: jobList->fg = job;

590:

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

592:

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

594: perror("tcsetpgrp");

595: }

596:

597: return 0;

598: }

599:

600: void removeJob(struct jobSet * jobList, struct job * job) {

  • Читать дальше
  • 1
  • ...
  • 239
  • 240
  • 241
  • 242
  • 243
  • 244
  • 245
  • 246
  • 247
  • 248
  • 249
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

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