Хрестоматия по программированию на Си в Unix


Системные вызовы и взаимодействие с UNIX. Хрестоматия по программированию на Си в Unix


Простой интерпретатор команд.

Данный раздел просто приводит исходный текст простого интерпретатора команд. Функция match описана в главе "Текстовая обработка".

/* Примитивный интерпретатор команд. Распознает построчно * команды вида: CMD ARG1 ... ARGn <FILE >FILE >>FILE >&FILE >>&FILE * Сборка: cc -U42 -DCWDONLY sh.c match.c pwd.c -o sh */

#include <sys/types.h>/* определение типов, используемых системой */ #include <stdio.h> /* описание библиотеки ввода/вывода */ #include <signal.h> /* описание сигналов */ #include <fcntl.h> /* определение O_RDONLY */ #include <errno.h> /* коды системных ошибок */ #include <ctype.h> /* макросы для работы с символами */ #include <dirent.h> /* эмуляция файловой системы BSD 4.2 */ #include <pwd.h> /* работа с /etc/passwd */ #include <sys/wait.h> /* описание формата wait() */

char cmd[256]; /* буфер для считывания команды */ #define MAXARGS 256 /* макс. количество аргументов */ char *arg[MAXARGS]; /* аргументы команды */ char *fin, *fout; /* имена для перенаправления ввода/вывода */ int rout; /* флаги перенаправления вывода */

char *firstfound; /* имя найденной, но невыполняемой программы */ #define LIM ':' /* разделитель имен каталогов в path */ extern char *malloc(), *getenv(), *strcpy(), *getwd(); extern char *strchr(), *execat(); extern void callshell(), printenv(), setenv(), dowait(), setcwd(); extern struct passwd *getpwuid(); /* Предопределенные переменные */ extern char **environ; /* окружение: изначально смотрит на тот же * массив, что и ev из main() */ extern int errno; /* код ошибки системного вызова */

char *strdup(s)char *s; { char *p; return(p=malloc(strlen(s)+1), strcpy(p,s)); } /* strcpy() возвращает свой первый аргумент */ char *str3spl(s, p, q) char *s, *p, *q; { char *n = malloc(strlen(s)+strlen(p)+strlen(q)+1); strcpy(n, s); strcat(n, p); strcat(n, q); return n; }

int cmps(s1, s2) char **s1, **s2; { return strcmp(*s1, *s2); } /* Перенаправить вывод */ #define APPEND 0x01 #define ERRTOO 0x02 int output (name, append, err_too, created) char *name; int *created; { int fd; *created = 0; /* Создан ли файл ? */




- Начало -  - Назад -  - Вперед -



Книжный магазин