Go Back   Armenian Knowledge Base > Technical sections > Webmaster Zone > Web Development

Reply
 
Thread Tools

pipe()
Old 07.11.2003, 15:04   #1
панаехавший
 
Obelix's Avatar
 
Join Date: 06 2003
Location: форпост
Age: 38
Posts: 4,007
Rep Power: 0
Default pipe()

Люди, такая вот проблема. Нужно раннуть одну прогу - из под пхп, но при этом нужно вырубить ее если она станет работать дольше определенного периуда времени. Я пробовал изпользовать че то виде:
PHP Code:
$handle=popen("./a.out","r");
sleep(3);
pclose($hanlde); 
где сорц a.out-а был
PHP Code:
main() {
system("touch file");
while(
1){}

Короче не работает - зацикливается скрипт, при том индикатора (file) не получаю?
Хэлп.
__________________
Իսկ ԴՈՒ արդեն վաճառե՞լ ես Հայրենիքդ ռուսներին:
My Exchange Rate Monitor | Իմ Արտարժույթի Մոնիտորը

Old 07.11.2003, 18:02   #2
¡no pasaran!
 
dolphin's Avatar
 
Join Date: 03 2002
Location: localhost
Age: 43
Posts: 540
Rep Power: 5
Default

разгадка кроется в самой команде plose(), которая унаследована из UNIX среды:


~$ man pclose
......
NAME
popen, pclose − process I/O

.......
The pclose function waits for the associated process to terminate and
returns the exit status of the command as returned by wait4.



Так как php использует эту самую функцию, то
твой скрипт блокируется на pclose() (либо при выходе, если ты вообще не используешь ее явно в скрипте).

Вероятным решением наверняка должно быть создание еще одного процесса из запущенной программы, который по тайм-ауту "убьет" своего родителя, после чего ты сможешь узнать о этом из возвращаемого разблокированным pclose() значения.
__________________
[ que fors aus ne le sot riens nee ]

Old 08.11.2003, 12:34   #3
панаехавший
 
Obelix's Avatar
 
Join Date: 06 2003
Location: форпост
Age: 38
Posts: 4,007
Rep Power: 0
Default

Ндаа... А на виндвозе это нельзя как то сделать? Или, можно ли достать pid запущенного процесса, а потом послать ему term?
__________________
Իսկ ԴՈՒ արդեն վաճառե՞լ ես Հայրենիքդ ռուսներին:
My Exchange Rate Monitor | Իմ Արտարժույթի Մոնիտորը

Old 08.11.2003, 20:43   #4
¡no pasaran!
 
dolphin's Avatar
 
Join Date: 03 2002
Location: localhost
Age: 43
Posts: 540
Rep Power: 5
Default

т.к. нет специальных пометок в документации, то под Винды работает так же.

А послать term можно, но проще это написать как небольшое предисловие к запускаемой программе [ fork() ], а не в php.
__________________
[ que fors aus ne le sot riens nee ]

Old 09.11.2003, 08:43   #5
панаехавший
 
Obelix's Avatar
 
Join Date: 06 2003
Location: форпост
Age: 38
Posts: 4,007
Rep Power: 0
Default

Проблема в том что прогу пишу не я (типа нечего мне больше делать чем кидать эту дурь в бесконечный цикл). А компилировать каждый раз исходный код все таки затруднительно.

А как можно послать term?
__________________
Իսկ ԴՈՒ արդեն վաճառե՞լ ես Հայրենիքդ ռուսներին:
My Exchange Rate Monitor | Իմ Արտարժույթի Մոնիտորը

Old 09.11.2003, 09:04   #6
¡no pasaran!
 
dolphin's Avatar
 
Join Date: 03 2002
Location: localhost
Age: 43
Posts: 540
Rep Power: 5
Default

нее.. я не имею в виду именну ту программу, которую ты хочешь запустить.

Нужно написать на С небольшую прогу, которая должна:

1. fork() -ает и запускает ту программу, которую нужно вырубить по тайм-ауту.
2. Спит определенное время. После пробуждения проверят состояние запущенной программы, и если она еще не завершена, убивает ее.

Компилируется эта штука 1 раз а программу и тайм аут можно передажать через argv.

Сам осилишь или написать ее код?
__________________
[ que fors aus ne le sot riens nee ]

Old 09.11.2003, 12:01   #7
панаехавший
 
Obelix's Avatar
 
Join Date: 06 2003
Location: форпост
Age: 38
Posts: 4,007
Rep Power: 0
Default

Честно говоря не очень разбираюсь - плиз дай короткий шаблон на C.
__________________
Իսկ ԴՈՒ արդեն վաճառե՞լ ես Հայրենիքդ ռուսներին:
My Exchange Rate Monitor | Իմ Արտարժույթի Մոնիտորը

Last edited by Obelix; 09.11.2003 at 12:27.

Old 09.11.2003, 20:54   #8
killa-hilla
 
Join Date: 03 2002
Location: Yaktown
Posts: 382
Rep Power: 0
Default

Code:
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
int main(int argc,char* argv[]){
   pid_t doch;
   doch = fork();
   if ( doch != 0)
      system(argv[1]);
   else {
      sleep(3);
      kill(doch,SIGTERM);
   }
}
__________________
Live Free or die...

Old 10.11.2003, 10:25   #9
панаехавший
 
Obelix's Avatar
 
Join Date: 06 2003
Location: форпост
Age: 38
Posts: 4,007
Rep Power: 0
Default

Ок, понятно, спасибо.
__________________
Իսկ ԴՈՒ արդեն վաճառե՞լ ես Հայրենիքդ ռուսներին:
My Exchange Rate Monitor | Իմ Արտարժույթի Մոնիտորը
Reply




Реклама:
реклама
Buy text link .

All times are GMT. The time now is 14:39.
Top

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.