Ожидание устройства или файла

Здесь и далее для краткости я буду приводить фрагменты программ, в которых не выполняются проверки на ошибки. Часто для того, чтобы начать работу с устройством или файлом, надо дождаться пока это устройство или файл будут инициализированы. В противном случае программа может аварийно завершится на вызове 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» );
}