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

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

Жанры

Разработка приложений в среде 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) {

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

Мастер...

Чащин Валерий
1. Мастер
Фантастика:
героическая фантастика
попаданцы
аниме
6.50
рейтинг книги
Мастер...

Жених из гроба

Сотис Майя
1. Гробокопательница
Фантастика:
юмористическое фэнтези
сказочная фантастика
фэнтези
5.00
рейтинг книги
Жених из гроба

Ищу жену с прицепом

Рам Янка
2. Спасатели
Любовные романы:
современные любовные романы
6.25
рейтинг книги
Ищу жену с прицепом

Гримуар тёмного лорда I

Грехов Тимофей
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Гримуар тёмного лорда I

Заклятие предков

Прозоров Александр Дмитриевич
3. Ведун
Фантастика:
фэнтези
альтернативная история
8.49
рейтинг книги
Заклятие предков

Крепость над бездной

Лисина Александра
4. Гибрид
Фантастика:
боевая фантастика
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Крепость над бездной

Рота Его Величества

Дроздов Анатолий Федорович
Новые герои
Фантастика:
боевая фантастика
8.55
рейтинг книги
Рота Его Величества

Экспансия: Сотрудничество. Том 5

Белов Артем
5. Планетарный десант
Фантастика:
боевая фантастика
аниме
5.00
рейтинг книги
Экспансия: Сотрудничество. Том 5

Отверженный III: Вызов

Опсокополос Алексис
3. Отверженный
Фантастика:
фэнтези
альтернативная история
7.73
рейтинг книги
Отверженный III: Вызов

Князь Серединного мира

Земляной Андрей Борисович
4. Страж
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Князь Серединного мира

Возвышение Меркурия. Книга 8

Кронос Александр
8. Меркурий
Фантастика:
героическая фантастика
попаданцы
аниме
5.00
рейтинг книги
Возвышение Меркурия. Книга 8

Эволюционер из трущоб. Том 5

Панарин Антон
5. Эволюционер из трущоб
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Эволюционер из трущоб. Том 5

Локки 7. Потомок бога

Решетов Евгений Валерьевич
7. Локки
Фантастика:
аниме
эпическая фантастика
фэнтези
5.00
рейтинг книги
Локки 7. Потомок бога

Черный Маг Императора 4

Герда Александр
4. Черный маг императора
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Черный Маг Императора 4