Разработка приложений в среде 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) {
Поделиться:
Популярные книги
Идеальный мир для Лекаря 12
12. Лекарь
Фантастика:
боевая фантастика
юмористическая фантастика
аниме
5.00
рейтинг книги
Повелитель механического легиона. Том I
1. Повелитель механического легиона
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Воевода
5. Помещик
Фантастика:
альтернативная история
5.00
рейтинг книги
«Три звезды» миллиардера. Отель для новобрачных
2. Три звезды
Любовные романы:
современные любовные романы
7.50
рейтинг книги
Мой любимый (не) медведь
Любовные романы:
современные любовные романы
7.90
рейтинг книги
Сопряжение 9
9. Сопряжение
Фантастика:
боевая фантастика
постапокалипсис
технофэнтези
рпг
5.00
рейтинг книги
Сержант. Назад в СССР. Книга 4
4. Второй шанс
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Табу на вожделение. Мечта профессора
4. Яд первой любви
Любовные романы:
современные любовные романы
5.58
рейтинг книги
Довлатов. Сонный лекарь 2
2. Не вывожу
Фантастика:
альтернативная история
аниме
5.00
рейтинг книги
70 Рублей - 2. Здравствуй S-T-I-K-S
Вселенная S-T-I-K-S
Фантастика:
боевая фантастика
постапокалипсис
5.00
рейтинг книги
Провинциал. Книга 4
4. Провинциал
Фантастика:
космическая фантастика
рпг
аниме
5.00
рейтинг книги
Горничная для тирана
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Вечный. Книга IV
4. Вечный
Фантастика:
боевая фантастика
попаданцы
рпг
5.00
рейтинг книги
Как я строил магическую империю 3
3. Как я строил магическую империю
Фантастика:
попаданцы
постапокалипсис
аниме
фэнтези
5.00