Чтение онлайн

на главную - закладки

Жанры

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

Троан Эрик В.

Шрифт:

367: job->text = malloc(count + 1);

368: strncpy(job->text, *commandPtr, count);

369: job->text[count] = '\0';

370: }

371:

372: *commandPtr = returnCommand;

373:

374: return 0;

375: }

376:

377: int setupRedirections(struct childProgram * prog) {

378: int i;

379: int openfd;

380: int mode;

381: struct redirectionSpecifier * redir = prog->redirections;

382:

383: for (i = 0; i < prog->numRedirections; i++, redir++) {

384: switch (redir->type) {

385: case REDIRECT_INPUT:

386: mode = O_RDONLY;

387: break;

388: case REDIRECT_OVERWRITE:

389: mode = O_RDWR | O_CREAT | O_TRUNC;

390: break;

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\n",

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\n", 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\n",

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: ожидался в точности один аргумент\n",

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

467: return 1;

468: }

469:

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

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

Эпоха Опустошителя. Том I

Павлов Вел
1. Вечное Ристалище
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Эпоха Опустошителя. Том I

Проблема майора Багирова

Майер Кристина
1. Спецназ
Любовные романы:
современные любовные романы
6.60
рейтинг книги
Проблема майора Багирова

Законы Рода. Том 13

Андрей Мельник
13. Граф Берестьев
Фантастика:
аниме
фэнтези
5.00
рейтинг книги
Законы Рода. Том 13

Газлайтер. Том 15

Володин Григорий Григорьевич
15. История Телепата
Фантастика:
боевая фантастика
попаданцы
5.00
рейтинг книги
Газлайтер. Том 15

О, Путник!

Арбеков Александр Анатольевич
1. Квинтет. Миры
Фантастика:
социально-философская фантастика
5.00
рейтинг книги
О, Путник!

Прометей: каменный век

Рави Ивар
1. Прометей
Фантастика:
альтернативная история
6.82
рейтинг книги
Прометей: каменный век

Её (мой) ребенок

Рам Янка
Любовные романы:
современные любовные романы
6.91
рейтинг книги
Её (мой) ребенок

Идеальный мир для Лекаря 8

Сапфир Олег
8. Лекарь
Фантастика:
юмористическое фэнтези
аниме
7.00
рейтинг книги
Идеальный мир для Лекаря 8

Прометей: каменный век II

Рави Ивар
2. Прометей
Фантастика:
альтернативная история
7.40
рейтинг книги
Прометей: каменный век II

Цвет сверхдержавы - красный. Трилогия

Симонов Сергей
Цвет сверхдержавы - красный
Фантастика:
попаданцы
альтернативная история
8.06
рейтинг книги
Цвет сверхдержавы - красный. Трилогия

Болтливый мертвец

Фрай Макс
7. Лабиринты Ехо
Фантастика:
фэнтези
9.41
рейтинг книги
Болтливый мертвец

На границе империй. Том 9. Часть 2

INDIGO
15. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 9. Часть 2

Истребители. Трилогия

Поселягин Владимир Геннадьевич
Фантастика:
альтернативная история
7.30
рейтинг книги
Истребители. Трилогия

Лишняя дочь

Nata Zzika
Любовные романы:
любовно-фантастические романы
8.22
рейтинг книги
Лишняя дочь