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

Тут можно читать онлайн Майкл Джонсон - Разработка приложений в среде Linux. Второе издание - бесплатно полную версию книги (целиком) без сокращений. Жанр: comp-osnet, издательство Вильямс, год 2007. Здесь Вы можете читать полную версию (весь текст) онлайн без регистрации и SMS на сайте лучшей интернет библиотеки ЛибКинг или прочесть краткое содержание (суть), предисловие и аннотацию. Так же сможете купить и скачать торрент в электронном формате fb2, найти и слушать аудиокнигу на русском языке или узнать сколько частей в серии и всего страниц в публикации. Читателям доступно смотреть обложку, картинки, описание и отзывы (комментарии) о произведении.
  • Название:
    Разработка приложений в среде Linux. Второе издание
  • Автор:
  • Жанр:
  • Издательство:
    Вильямс
  • Год:
    2007
  • Город:
    Москва
  • ISBN:
    978-5-8459-1143-8
  • Рейтинг:
    3.8/5. Голосов: 101
  • Избранное:
    Добавить в избранное
  • Отзывы:
  • Ваша оценка:
    • 80
    • 1
    • 2
    • 3
    • 4
    • 5

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

Разработка приложений в среде Linux. Второе издание - описание и краткое содержание, автор Майкл Джонсон, читайте бесплатно онлайн на сайте электронной библиотеки LibKing.Ru

Книга известных профессионалов в области разработки коммерческих приложений в Linux представляет собой отличный справочник для широкого круга программистов в Linux, а также тех разработчиков на языке С, которые перешли в среду Linux из других операционных систем. Подробно рассматриваются концепции, лежащие в основе процесса создания системных приложений, а также разнообразные доступные инструменты и библиотеки. Среди рассматриваемых в книге вопросов можно выделить анализ особенностей применения лицензий GNU, использование свободно распространяемых компиляторов и библиотек, системное программирование для Linux, а также написание и отладка собственных переносимых библиотек. Изобилие хорошо документированных примеров кода помогает лучше усвоить особенности программирования в Linux.

Книга рассчитана на разработчиков разной квалификации, а также может быть полезна для студентов и преподавателей соответствующих специальностей.

Разработка приложений в среде Linux. Второе издание - читать онлайн бесплатно полную версию (весь текст целиком)

Разработка приложений в среде Linux. Второе издание - читать книгу онлайн бесплатно, автор Майкл Джонсон
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

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) {

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

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

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

483: return 1;

484: }

485:

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

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

488:

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

490: perror("tcsetpgrp");

491: jobList->fg = job;

492: }

493:

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

495: for (i = 0; inumProgs; 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\n",

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

585:

586: printf("[%d] %d\n", job->jobId,

587: newJob.progs[newJob.numProgs - 1].pid);

588: } else {

589: jobList->fg = job;

590:

591: /* перемещаем новую группу процессов на передний план */

592:

593: if (tcsetpgrp(0, newJob.pgrp))

594: perror("tcsetpgrp");

595: }

596:

597: return 0;

598: }

599:

600: void removeJob(struct jobSet * jobList, struct job * job) {

601: struct job * prevJob;

602:

603: freeJob(job);

604: if (job == jobList->head) {

605: jobList->head = job->next;

606: } else {

607: prevJob = jobList->head;

608: while (prevJob->next != job) prevJob = prevJob->next;

609: prevJob->next = job->next;

610: }

611:

612: free(job);

613: }

614:

615: /* Проверяем, завершился ли какой-либо фоновый процесс - если да, то

616: устанавливаем причину и проверяем, окончилось ли выполнение задания */

617: void checkJobs(struct jobSet * jobList) {

618: struct job * job;

619: pid_t childpid;

620: int status;

621: int progNum;

622: char * msg;

623:

624: while ((childpid = waitpid(-1, &status,

625: WNOHANG | WUNTRACED)) > 0) {

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

627: progNum = 0;

628: while(progNum < job->numProgs &&

629: job->progs[progNum].pid != childpid)

630: progNum++;

631: if (progNum < job->numProgs) break;

632: }

633:

634: if (WIFEXITED(status) || WIFSIGNALED(status)) {

635: /* дочерний процесс завершил работу */

636: job->runningProgs--;

637: job->progs[progNum].pid = 0;

638:

639: if (!WIFSIGNALED(status))

640: msg = "Завершено";

641: else

642: msg = strsignal(WTERMSIG(status));

643:

644: if (!job->runningProgs) {

645: printf(JOB_STATUS_FORMAT, job->jobId,

646: msg, job->text);

647: removeJob(jobList, job);

648: }

649: } else {

650: /* выполнение дочернего процесса остановлено */

651: job->stoppedProgs++;

652: job->progs[progNum].isStopped = 1;

653:

654: if (job->stoppedProgs == job->numProgs) {

655: printf(JOB_STATUS_FORMAT, job->jobId, "Остановлено",

656: job->text);

657: }

658: }

659: }

660:

661: if (childpid == -1 && errno != ECHILD)

662: perror("waitpid");

663: }

664:

665: int main(int argc, const char ** argv) {

Читать дальше
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать


Майкл Джонсон читать все книги автора по порядку

Майкл Джонсон - все книги автора в одном месте читать по порядку полные версии на сайте онлайн библиотеки LibKing.




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


Отзывы читателей о книге Разработка приложений в среде Linux. Второе издание, автор: Майкл Джонсон. Читайте комментарии и мнения людей о произведении.


Понравилась книга? Поделитесь впечатлениями - оставьте Ваш отзыв или расскажите друзьям

Напишите свой комментарий
x