LINUX.ORG.RU

[php] fread() timeout

 


0

1

есть php-скрипт, который посылает и получает команды (AT+..) от модема (/dev/ttyUSB0)
почему php - спрашивать не меня, а заказчика.
(вообще, задача такая: отправить AT-команду и получить ответ до запятой)
код таков:


$fp = fopen('/dev/ttyUSB0', 'r+');

fwrite($fp, $req);


while($char != ','){
 $char = fgetc($fp);
 $data = "$data$char";
}

если модем висит, то цикл будет бесконечным. как этого предотвратить?

★★★★★

Последнее исправление: snoopcat (всего исправлений: 1)

stream_set_timeout() не предлагать, ибо он только на сокеты, ага

snoopcat ★★★★★
() автор топика
Ответ на: комментарий от anon_666

нету =_=
был dio_open() с флагами, но его, емнип, выпилили.

snoopcat ★★★★★
() автор топика

На ум приходит только заведение счетчика и выход из цикла при его переполнении.

Что-то вроде такого

$fp = fopen('/dev/ttyUSB0', 'r+');

fwrite($fp, $req);

define("MAX_ITERATIONS",100500);

$counter = 0;
while($char != ',' && $counter<MAX_ITERATIONS){
 $counter++;
 $char = fgetc($fp);
 $data = "$data$char";
}

Можно попробовать заюзать:

http://php.net/manual/en/function.pcntl-signal.php + SIGALRM, но сам это не пробовал, и не могу сказать насколько оно рабочее.

r_asian ★☆☆
()
Ответ на: SIGALRM от Olegymous

Но не в php. Судя по всему fread() не прерывается сигналом. Тогда остаётся перевести чтение в неблокирующий режим с помощью stream_set_blocking($fp, 0) и развлекаться.

Olegymous ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.