Armenian Knowledge Base  

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

Reply
 
LinkBack Thread Tools
Old 07.11.2003, 15:04   #1
панаехавший
 
Obelix's Avatar
 
Join Date: 06 2003
Location: форпост
Age: 30
Posts: 4,007
Downloads: 0
Uploads: 0
Reputation: 0 | 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) не получаю?
Хэлп.
Reply With Quote
Old 07.11.2003, 18:02   #2
¡no pasaran!
 
dolphin's Avatar
 
Join Date: 03 2002
Location: localhost
Age: 35
Posts: 540
Downloads: 0
Uploads: 0
Reputation: 13 | 4
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() значения.
Reply With Quote
Old 08.11.2003, 12:34   #3
панаехавший
 
Obelix's Avatar
 
Join Date: 06 2003
Location: форпост
Age: 30
Posts: 4,007
Downloads: 0
Uploads: 0
Reputation: 0 | 0
Default

Ндаа... А на виндвозе это нельзя как то сделать? Или, можно ли достать pid запущенного процесса, а потом послать ему term?
Reply With Quote
Old 08.11.2003, 20:43   #4
¡no pasaran!
 
dolphin's Avatar
 
Join Date: 03 2002
Location: localhost
Age: 35
Posts: 540
Downloads: 0
Uploads: 0
Reputation: 13 | 4
Default

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

А послать term можно, но проще это написать как небольшое предисловие к запускаемой программе [ fork() ], а не в php.
Reply With Quote
Old 09.11.2003, 08:43   #5
панаехавший
 
Obelix's Avatar
 
Join Date: 06 2003
Location: форпост
Age: 30
Posts: 4,007
Downloads: 0
Uploads: 0
Reputation: 0 | 0
Default

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

А как можно послать term?
Reply With Quote
Old 09.11.2003, 09:04   #6
¡no pasaran!
 
dolphin's Avatar
 
Join Date: 03 2002
Location: localhost
Age: 35
Posts: 540
Downloads: 0
Uploads: 0
Reputation: 13 | 4
Default

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

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

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

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

Сам осилишь или написать ее код?
Reply With Quote
Old 09.11.2003, 12:01   #7
панаехавший
 
Obelix's Avatar
 
Join Date: 06 2003
Location: форпост
Age: 30
Posts: 4,007
Downloads: 0
Uploads: 0
Reputation: 0 | 0
Default

Честно говоря не очень разбираюсь - плиз дай короткий шаблон на C.

Last edited by Obelix; 09.11.2003 at 12:27.
Reply With Quote
Old 09.11.2003, 20:54   #8
killa-hilla
 
Join Date: 03 2002
Location: Yaktown
Posts: 382
Downloads: 0
Uploads: 0
Reputation: 0 | 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);
   }
}
Reply With Quote
Old 10.11.2003, 10:25   #9
панаехавший
 
Obelix's Avatar
 
Join Date: 06 2003
Location: форпост
Age: 30
Posts: 4,007
Downloads: 0
Uploads: 0
Reputation: 0 | 0
Default

Ок, понятно, спасибо.
Reply With Quote
Sponsored Links
Reply

Thread Tools


На правах рекламы:
реклама

All times are GMT. The time now is 09:51.


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