UNIX — универсальная среда программирования
Шрифт:
signal(SIGQUIT, qstat);
return status;
}
3.8.53
system.c
/*
* Safer version of system for interactive programs
*/
#include <signal.h>
#include <stdio.h>
system(s) /* run command line s */
char *s;
{
int status, pid, w, tty;
int (*istat), (*qstat);
extern char *progname;
fflush(stdout);
tty = open("/dev/tty", 2);
if (tty == -1) {
fprintf (stderr, "%s: can't open /dev/tty\n", progname);
return -1;
}
if ((pid = fork) == 0) {
close(0);
dup(tty);
close(1);
dup(tty);
close(2);
dup(tty);
close(tty);
execlp("sh", "sh", "-c", s, (char*)0);
exit(127);
}
close(tty);
istat = signal(SIGINT, SIG_IGN);
qstat = signal(SIGQUIT, SIG_IGN);
while ((w = wait(&status)) != pid && w != -1)
;
if (w == -1)
status = -1;
signal(SIGINT, istat);
signal(SIGQUIT, qstat);
return status;
}
3.8.54
timeout.c
/* timeout: set time limit on a process */
#include <stdio.h>
#include <signal.h>
int pid; /* child process id */
char *progname;
main(argc, argv)
int argc;
char *argv[];
{
int sec = 10, status, onalarm;
progname = argv[0];
if (argc > 1 && argv[1][0] == '-') {
sec = atoi(&argv[1][1]);
argc--;
argv++;
}
if (argc < 2)
error("Usage: %s [-10] command", progname);
if ((pid=fork) == 0) {
execvp(argv[1], &argv[1]);
error("couldn't start %s", argv[1]);
}
signal(SIGALRM, onalarm);
alarm(sec);
if (wait(&status) == -1 || (status & 0177) != 0)
error("%s killed", argv[1]);
exit((status >> 8) & 0377);
}
onalarm /* kill child when alarm arrives */
{
kill(pid, SIGKILL);
}
#include "error.c"
3.8.55
toolong
length($0) > 72 { print "Line", NR, "too long:", substr($0,1,60) }
3.8.56
ttyin1.c
ttyin /* process response from /dev/tty (version 1) */
{
char buf[BUFSIZ];
FILE *efopen;
static FILE *tty = NULL;
if (tty == NULL)
tty = efopen("/dev/tty", "r");
if (fgets(buf, BUFSIZ, tty) == NULL || buf[0] == 'q')
exit(0);
else /* ordinary line */
return buf[0];
}
3.8.57
ttyin2.c
ttyin /* process response from /dev/tty (version 2) */
{
char buf[BUFSIZ];
FILE *efopen;
static FILE *tty = NULL;
if (tty == NULL)
tty = efopen("/dev/tty", "r");
for (;;) {
if (fgets(buf,BUFSIZ,tty) == NULL || buf[0] == 'q')
exit(0);
else if (buf[0] == '!') {
system(buf+1); /* BUG here */
printf("!\n");
}
else /* ordinary line */
return buf[0];
}
}
#include "system.c"
Поделиться:
Популярные книги
Кодекс Крови. Книга III
3. РОС: Кодекс Крови
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Отчий дом. Семейная хроника
Проза:
классическая проза
5.00
рейтинг книги
Скандальная свадьба
1. Такие разные свадьбы
Любовные романы:
современные любовные романы
эро литература
5.00
рейтинг книги
Путанабус. Трилогия
Фантастика:
боевая фантастика
6.93
рейтинг книги
Идеальный мир для Лекаря 25
25. Лекарь
Фантастика:
фэнтези
юмористическое фэнтези
аниме
5.00
рейтинг книги
Кодекс Крови. Книга ХVI
16. РОС: Кодекс Крови
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Проданная невеста
Любовные романы:
любовно-фантастические романы
5.80
рейтинг книги
Потомок бога
1. Локки
Фантастика:
попаданцы
альтернативная история
аниме
сказочная фантастика
5.00
рейтинг книги
С Д. Том 16
16. Сердце дракона
Фантастика:
боевая фантастика
6.94
рейтинг книги
Переиграть войну! Пенталогия
Переиграть войну!
Фантастика:
героическая фантастика
альтернативная история
8.25
рейтинг книги
От Советского Информбюро - 1941-1945 (Сборник)
Документальная литература:
биографии и мемуары
5.00
рейтинг книги

Санек 3
3. Санек
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Прометей: повелитель стали
3. Прометей
Фантастика:
фэнтези
7.05
рейтинг книги
Отмороженный 14.0
14. Отмороженный
Фантастика:
боевая фантастика
попаданцы
рпг
5.00