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

507:   if ((i + 1) < newJob.numProgs) {

508:    pipe(pipefds);

509:    nextout = pipefds[1];

510:   } else {

511:    nextout = 1;

512:   }

513:

514:   pipe(controlfds);

515:

516:   if (!(newJob.progs[i].pid = fork())) {

517:    signal(SIGTTOU, SIG_DFL);

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))

Перейти на страницу:

Похожие книги

1С: Бухгалтерия 8 с нуля
1С: Бухгалтерия 8 с нуля

Книга содержит полное описание приемов и методов работы с программой 1С:Бухгалтерия 8. Рассматривается автоматизация всех основных участков бухгалтерии: учет наличных и безналичных денежных средств, основных средств и НМА, прихода и расхода товарно-материальных ценностей, зарплаты, производства. Описано, как вводить исходные данные, заполнять справочники и каталоги, работать с первичными документами, проводить их по учету, формировать разнообразные отчеты, выводить данные на печать, настраивать программу и использовать ее сервисные функции. Каждый урок содержит подробное описание рассматриваемой темы с детальным разбором и иллюстрированием всех этапов.Для широкого круга пользователей.

Алексей Анатольевич Гладкий

Программирование, программы, базы данных / Программное обеспечение / Бухучет и аудит / Финансы и бизнес / Книги по IT / Словари и Энциклопедии
1С: Управление торговлей 8.2
1С: Управление торговлей 8.2

Современные торговые предприятия предлагают своим клиентам широчайший ассортимент товаров, который исчисляется тысячами и десятками тысяч наименований. Причем многие позиции могут реализовываться на разных условиях: предоплата, отсрочка платежи, скидка, наценка, объем партии, и т.д. Клиенты зачастую делятся на категории – VIP-клиент, обычный клиент, постоянный клиент, мелкооптовый клиент, и т.д. Товарные позиции могут комплектоваться и разукомплектовываться, многие товары подлежат обязательной сертификации и гигиеническим исследованиям, некондиционные позиции необходимо списывать, на складах периодически должна проводиться инвентаризация, каждая компания должна иметь свою маркетинговую политику и т.д., вообщем – современное торговое предприятие представляет живой организм, находящийся в постоянном движении.Очевидно, что вся эта кипучая деятельность требует автоматизации. Для решения этой задачи существуют специальные программные средства, и в этой книге мы познакомим вам с самым популярным продуктом, предназначенным для автоматизации деятельности торгового предприятия – «1С Управление торговлей», которое реализовано на новейшей технологической платформе версии 1С 8.2.

Алексей Анатольевич Гладкий

Финансы / Программирование, программы, базы данных