391:   case REDIRECT_APPEND:

392:    mode = O_RDWR | O_CREAT | O_APPEND;

393:    break;

394:   }

395:

396:   openfd = open(redir->filename, mode, 0666);

397:   if (openfd < 0) {

398:    /* мы могли потерять это в случае переадресации stderr,

399:       хотя bash и ash тоже потеряют его (а вот

400:       zsh - нет!) */

401:    fprintf(stderr, 'ошибка при открытии %s: %s ',

402:    redir->filename, strerror(errno));

403:    return 1;

404:   }

405:

406:   if (openfd != redir->fd) {

407:    dup2(openfd, redir->fd);

408:    close(openfd);

409:   }

410:  }

411:

412:  return 0;

413: }

414:

415: int runCommand(struct job newJob, struct jobSet * jobList,

416:  int inBg) {

417:  struct job * job;

418:  char * newdir, * buf;

419:  int i, len;

420:  int nextin, nextout;

421:  int pipefds[2]; /* pipefd[0] предназначен для чтения */

422:  char * statusString;

423:  int jobNum;

424:  int controlfds[2] ;/*канал для возможности приостановки работы дочернего процесса*/

425:

426:  /* здесь производится обработка встраиваемых модулей — мы не используем fork (),

427:     поэтому, чтобы поместить процесс в фон, придется потрудиться */

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

429:   /* здесь возвращается реальный код выхода */

430:   exit(0);

431:  } else if (!strcmp(newJob.progs[0].argv[0], 'pwd')) {

432:   len = 50;

433:   buf = malloc(len);

434:   while (!getcwd(buf, len) && errno == ERANGE) {

435:    len += 50;

436:    buf = realloc(buf, len);

437:   }

438:   printf('%s ', buf);

439:   free(buf);

440:   return 0;

441:  } else if (!strcmp(newJob.progs[0].argv[0], 'cd')) {

442:   if (!newJob.progs[0].argv[1] == 1)

443:    newdir == getenv('HOME');

444:   else

445:    newdir = newJob.progs[0].argv[1];

446:   if (chdir(newdir))

447:    printf('сбой при смене текущего каталога: %s ',

448:     strerror(errno));

449:   return 0;

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

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

452:    if (job->runningProgs == job->stoppedProgs)

453:     statusString = 'Остановлено';

454:    else

455:     statusString = 'Выполняется';

456:

457:    printf(JOB_STATUS_FORMAT, job->jobId, statusString,

458:     job->text);

459:   }

460:   return 0;

461:  } else if (!strcmp(newJob.progs[0].argv[0], 'fg') ||

462:   !strcmp(newJob.progs[0].argv[0], 'bg')) {

463:   if (!newJob.progs[0].argv[1] || newJob.progs[0].argv[2]) {

464:    fprintf(stderr,

465:     '%s: ожидался в точности один аргумент ',

466:     newJob.progs[0].argv[0]);

467:    return 1;

468:   }

469:

470:   if (sscanf(newJob.progs[0].argv[1], '%%%d', &jobNum) != 1) {

471:    fprintf(stderr, '%s: неверный аргумент '%s' ',

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

473:     newJob.progs[0].argv[1]);

474:    return 1;

475:   }

476:

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

478:    if (job->jobId == jobNum) break;

479:

480:   if (!job) {

481:    fprintf(stderr, '%s: неизвестное задание %d ',

482:     newJob.progs[0].argv[0], jobNum);

483:    return 1;

484:   }

485:

486:   if (*new Job. progs[0].argv[0] == 'f') {

487:    /* Переводим задание на передний план */

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

0

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

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