488:

489:    if (tcsetpgrp(0, job->pgrp))

490:     perror('tcsetpgrp');

491:    jobList->fg = job;

492:   }

493:

494:   /* Повторяем запуск процессов в задании */

495:   for (i = 0; i<job->numProgs; i++)

496:    job->progs[i].isStopped = 0;

497:

498:   kill(-job->pgrp, SIGCONT);

499:

500:   job->stoppedProgs = 0;

501:

502:   return 0;

503:  }

504:

505:  nextin = 0, nextout = 1;

506:  for (i = 0; i < newJob.numProgs; i++) {

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 ',

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:      в список фоновых заданий и оставляем их */

Добавить отзыв
ВСЕ ОТЗЫВЫ О КНИГЕ В ИЗБРАННОЕ

0

Вы можете отметить интересные вам фрагменты текста, которые будут доступны по уникальной ссылке в адресной строке браузера.

Отметить Добавить цитату