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


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


/* Запуск командного файла при помощи вызова интерпретатора */ void callshell(progr, av, envp) char *progr, **av, **envp; { register i; char *sh; char *newav[MAXARGS+2]; int fd; char first = 0;

if((fd = open(progr, O_RDONLY)) < 0 ) sh = "/bin/sh"; else{ read(fd, &first, 1); close(fd); sh = (first == '#') ? "/bin/csh" : "/bin/sh"; } newav[0] = "Shellscript"; newav[1] = progr; for(i=1; av[i]; i++) newav[i+1] = av[i]; newav[i+1] = NULL; printf( "Вызываем %s\n", sh ); execve(sh, newav, envp); }

/* Ожидать окончания всех процессов, выдать причины смерти. */ void dowait(){ int ws; int pid;

while((pid = wait( &ws)) > 0 ){ if( WIFEXITED(ws)){ printf( "Процесс %d умер с кодом %d\n", pid, WEXITSTATUS(ws)); }else if( WIFSIGNALED(ws)){ printf( "Процесс %d убит сигналом %d\n", pid, WTERMSIG(ws)); if(WCOREDUMP(ws)) printf( "Образовался core\n" ); /* core - образ памяти процесса для отладчика adb */ }else if( WIFSTOPPED(ws)){ printf( "Процесс %d остановлен сигналом %d\n", pid, WSTOPSIG(ws)); } } } /* Расширение шаблонов имен. Это упрощенная версия, которая * расширяет имена только в текущем каталоге. */ void glob(dir, args, indx, str /* что расширять */, quote ) char *args[], *dir; int *indx; char *str; char quote; /* кавычки, в которые заключена строка str */ { static char globchars[] = "*?["; char *p; char **start = &args[ *indx ]; short nglobbed = 0;

register struct dirent *dirbuf; DIR *fd; extern DIR *opendir();

/* Затычка для отмены глоббинга: */ if( *str == '\\' ){ str++; goto noGlob; }

/* Обработка переменных $NAME */ if( *str == '$' && quote != '\'' ){ char *s = getenv(str+1); if( s ) str = s; } /* Анализ: требуется ли глоббинг */ if( quote ) goto noGlob; for( p=str; *p; p++ ) /* Есть ли символы шаблона? */ if( strchr(globchars, *p)) goto doGlobbing; noGlob: args[ (*indx)++ ] = strdup(str); return;

doGlobbing: if((fd = opendir (dir)) == NULL){ fprintf(stderr, "Can't read %s\n", dir); return; } while ((dirbuf = readdir (fd)) != NULL ) { if (dirbuf->d_ino == 0) continue; if (strcmp (dirbuf->d_name, ".") == 0 strcmp (dirbuf->d_name, "..") == 0) continue; if( match( dirbuf->d_name, str)){ args[ (*indx)++ ] = strdup(dirbuf->d_name); nglobbed++; } } closedir(fd); if( !nglobbed){ printf( "%s: no match\n", str); goto noGlob; }else{ /* отсортировать */ qsort(start, nglobbed, sizeof (char *), cmps); } }




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



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