Здесь и далее для краткости я буду приводить фрагменты программ, в которых не выполняются проверки на ошибки. Часто для того, чтобы начать работу с устройством или файлом, надо дождаться пока это устройство или файл будут инициализированы. В противном случае программа может аварийно завершится на вызове open(). Ожидание устройства реализовано в утилите on следующим образом:
-W nsec number of seconds to wait for -w
-w name wait for name to exist.
Попробуем реализовать это сами. Для определения возможности доступа к файлу используется вызов stat(). Следовательно, нам надо определить структуру, в которую этот вызов в случае успешного завершения возвратит данные о файле:
struct stat st;
Определим переменную — указатель на путь к файлу path. Мы будем считать, что параметры передаются программе из командной строки.
char * path = NULL;
Количество секунд, после которых программа аварийно завершится, если файл так и не будет найден.
int sec;
Возвращаемое значение для вызова stat():
int retcode;
Здесь мы просто проверяем командную строку на количество параметров. Будем считать, что программа вызывается следующим образом:
% ./wait_file < устройство > < количество секунд >
if( argc < 3 )
exit( EXIT_FAILURE );
Копируем в переменную path первый аргумент командной строки, т.е. путь до устройства.
path = (char *)strdup( argv[1] );
Берем количество секунд из второго аргумента.
sec = atoi( argv[2] ) + 1;
Для ожидания будем использовать цикл while, уменьшая на единицу количество оставшихся секунд и запрашивая состояние файла в условии цикла. Цикл завершится, если файл будет обнаружен и информация о нем будет успешно получена, или истечет период ожидания (sec == 0).
while(((retcode = stat(path, &st;)) == -1) && (sec—)){
Если устройство еще не обнаружено, то «засыпаем» на одну секунду.
sleep( 1 );
}
Мы вышли из цикла; проверяем, было ли найдено устройство.
if( retcode != 0 ){
fprintf( stderr, «device not found\n» );
}