Модераторы: ginnie, korob2001

Поиск:

Закрытая темаСоздание новой темы Создание опроса
> Клонирование процесса Perl/Tk+Win32, Win32::Process & fork() 
:(
    Опции темы
Гость_antony
  Дата 30.8.2005, 14:14 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Есть проблема.
При работе под Win32 с использованием Tk надо создать копию текущего процесса в асинхронном режиме. fork() под виндой не работает, и вызывает системную ошибку. smile Открытие процесса как дескриптора не подходит, ибо позволяет создать только один дочерний процесс.
Win32::Process::Create работать не хочет по непонятным причинам.
Пытаюсь сделать примерно следующее:
Код

use Win32::Process;

my $Process;

Win32::Process::Create($Process,
   "C:/perl/bin/perl.exe",
   "D:/projects/Win_Perl/win.pl",
   0,
   DETACHED_PROCESS,
  ".") || die print_error();


Вызывается все это из уже запущенного процесса.
Что еще для счастья надо? smile
  Вверх
sharq
Дата 30.8.2005, 17:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Perl Liker
**


Профиль
Группа: Участник
Сообщений: 841
Регистрация: 13.12.2004
Где: Ростов-на-Дону

Репутация: 3
Всего: 28



Гость_antony я не знаю, что ты хочешь с помощью этого сделать, но читать документацию надо внимательно. smile

Код

use strict;
use Win32;
use Win32::Process;

sub ErrorReport{
    print Win32::FormatMessage( Win32::GetLastError() );
}

my ($process);
Win32::Process::Create( $process,
                        "D:\\Web\\perl\\bin\\perl.exe",
                        "test.pl",
                        0,
                        DETACHED_PROCESS,
                        "." ) || die ErrorReport();

$process->Suspend();
$process->Resume();
$process->Wait(INFINITE);


Зачем три темы было создавать?

smile


--------------------
[color=gray]There's More Than One Way To Do It[/color]
PM MAIL WWW ICQ Skype   Вверх
Usya
Дата 31.8.2005, 07:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 154
Регистрация: 7.6.2005

Репутация: нет
Всего: нет



Цитата
fork() под виндой не работает


Кто сказал? Работает. Правда не всегда. Когда то сам наткнулся на это:

Цитата
Сразу хочу огорчить программистов под Windows. К сожалению, некоторые из описанных ниже рецептов под Windows работать не будут.


Правда где-то читал, что Microsoft вроде бы обращалась с просьбой на счет исправления некоторых глюков. Может желтая пресса, но пока то, что есть.

Кстати, можешь попробовать это
Код

#!/usr/bin/perl
if (!defined($kidpid = fork())) { die "cannot fork: $!"}
 elsif ($kidpid == 0)
   { 
     print "Я ребенок! $$\n";
     print scalar localtime(time),"\n";
     sleep(5);
     print scalar localtime(time),"\n";
     exit;
   }
  else
   {
     print "А я - родитель! $$\n";
     print scalar localtime(time),"\n";
     sleep(5);
     print scalar localtime(time),"\n";
     waitpid($kidpid, 0); # Сам смотри - нужно или нет и куда вставлять
   }


Сравни время начала и конца обоих процессов
smile
--------------------
Я не волшебник, я только учусь...
PM MAIL   Вверх
smth
Дата 31.8.2005, 11:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 30.8.2005

Репутация: нет
Всего: нет



sharq, большой разницы в коде я не вижу. В твоем коде явно указана подпрограмма обработки ошибки, а у меня нет. Вот, практически, и все. Если есть КОНКРЕТНЫЕ замечания/предложения - обсудим!
На самом деле, если в качестве параметров прописать какой-нить Notepad, то код работает.
Вообще похоже на то, что с этой самой Tk Win32::Process не может создать второй процесс, ибо считает, что он дублируется. Почему? Как можно динамически выделить уникальный ID процессу?
В некоторых примерах от CPAN при создании процесса применяется следующая конструкция:
Код

Win32::Process::Create($Win32::Process::Create::ProcessObj,

и т.д.
Здесь, насколько я понимаю, ProcessObj создает объект для текущего процесса, если его не было - хотя может быть я и ошибаюсь. Хотелось бы разобраться получше.
Три сообщения это глюки експловера

Usya
спаибо за совет, только fork() вызывает системную ошибку, во всяком случае у меня на компе smile
PM MAIL   Вверх
sharq
Дата 31.8.2005, 15:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Perl Liker
**


Профиль
Группа: Участник
Сообщений: 841
Регистрация: 13.12.2004
Где: Ростов-на-Дону

Репутация: 3
Всего: 28



smth разница в подключение модуля Win32. Запусти этот код, он рабочий, открывается командный интерпретатор perl. Только за чем тебе это.

Лучше скажи, что тебе нужно.

smile


--------------------
[color=gray]There's More Than One Way To Do It[/color]
PM MAIL WWW ICQ Skype   Вверх
smth
Дата 31.8.2005, 15:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 30.8.2005

Репутация: нет
Всего: нет



sharq! Блин! Мне не нужен интерпритатор! Мне нужна КОПИЯ ТЕКУЩЕГО ПРОЦЕССА!
Задача: написать мультиплатформенное приложение на перле с использованием интерфейса пользователя, т.е. модуля Tk. Это самое приложение должно иметь возможность открытия еще одной рабочей области, являющейся копией родительской. При этом оба созданных приложения дожны работать независимо друг от друга (наподобии "File/New->Window" в IE). Для решения данной задачи необходимо создать копию текущего процесса, что можно осуществить или вызовом fork() (который не работает под Win32) или использованием библиотеки Win32.
PM MAIL   Вверх
sharq
Дата 2.9.2005, 00:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Perl Liker
**


Профиль
Группа: Участник
Сообщений: 841
Регистрация: 13.12.2004
Где: Ростов-на-Дону

Репутация: 3
Всего: 28



smth

Цитата(smth @ 31.8.2005, 16:23)
написать мультиплатформенное приложение

Тогда зачем ты используешь модуль Win32?

Цитата(smth @ 31.8.2005, 16:23)
осуществить или вызовом fork() (который не работает под Win32)

Цитата(smth @ 31.8.2005, 12:53)
только fork() вызывает системную ошибку, во всяком случае у меня на компе

Приведи код и ошибку.

smile




--------------------
[color=gray]There's More Than One Way To Do It[/color]
PM MAIL WWW ICQ Skype   Вверх
Usya
Дата 2.9.2005, 01:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 154
Регистрация: 7.6.2005

Репутация: нет
Всего: нет



smth, а ты не пробовал работать с потоками?
Если нет, посмотри документацию к модулю threads и соответствующие примеры.
--------------------
Я не волшебник, я только учусь...
PM MAIL   Вверх
smth
Дата 2.9.2005, 08:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 30.8.2005

Репутация: нет
Всего: нет



sharq
Цитата
написать мультиплатформенное приложение


Тогда зачем ты используешь модуль Win32?

Потому что я могу динамически отпределить, в какой OS нахожусь. И, соответсвенно, юзать те или иные модули.

Цитата
Приведи код и ошибку.

Винда убивает перловый процесс напрочь. При этом выкидывается стандартная тряпочка с предложением послать код ошибки в microsoft. Получить код ошибки от перла не получается.


Usya Я задумывался над этим. В принципе, если не создавать копию процесса, а запускать новый поток и в нем уже запустить совершенно новый процесс - может и выгорит.

Только мне уже из принципа интересно, почему не работают стандартные функции smile
PM MAIL   Вверх
Usya
Дата 2.9.2005, 09:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 154
Регистрация: 7.6.2005

Репутация: нет
Всего: нет



Стоп!

Я сам, правда с потоками не работал, только с процессами экспериментировал, поэтому кое-что могу и сам сморозить, но кажется ты немного путаешь понятия процесса и потока.

На одном из сайтов видел это (правда было написано для Javi, но в данном случае думаю без разницы)

Цитата

Процессы, потоки и приоритеты


Прежде чем приступить к разговору о многопоточности, следует уточнить некоторые термины.

Обычно в любой многопоточной операционной системе выделяют такие объекты, как процессы и потоки. Между ними существует большая разница, которую следует четко себе представлять.

Процесс

Процесс (process) - это объект, который создается операционной системой, когда пользователь запускает приложение. Процессу выделяется отдельное адресное пространство, причем это пространство физически недоступно для других процессов. Процесс может работать с файлами или с каналами связи локальной или глобальной сети. Когда вы запускаете текстовый процессор или программу калькулятора, вы создаете новый процесс.

Поток

Для каждого процесса операционная система создает один главный поток (thread ), который является потоком выполняющихся по очереди команд центрального процессора. При необходимости главный поток может создавать другие потоки, пользуясь для этого программным интерфейсом операционной системы.

Все потоки, созданные процессом, выполняются в адресном пространстве этого процесса и имеют доступ к ресурсам процесса. Однако поток одного процесса не имеет никакого доступа к ресурсам потока другого процесса, так как они работают в разных адресных пространствах. При необходимости организации взаимодействия между процессами или потоками, принадлежащими разным процессам, следует пользоваться системными средствами, специально предназначенными для этого.


А с этим

Цитата
Только мне уже из принципа интересно, почему не работают стандартные функции


действительно надо разбираться smile
--------------------
Я не волшебник, я только учусь...
PM MAIL   Вверх
sharq
Дата 2.9.2005, 09:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Perl Liker
**


Профиль
Группа: Участник
Сообщений: 841
Регистрация: 13.12.2004
Где: Ростов-на-Дону

Репутация: 3
Всего: 28



smth
Цитата(smth @ 2.9.2005, 09:29)
Потому что я могу динамически отпределить, в какой OS нахожусь. И, соответсвенно, юзать те или иные модули.


Не самый лучший вариант... но если по другому нельзя...

Цитата(smth @ 2.9.2005, 09:29)
Винда убивает перловый процесс напрочь. При этом выкидывается стандартная тряпочка с предложением послать код ошибки в microsoft. Получить код ошибки от перла не получается.

Привиде код скрипта! Интересно, что ты там написал. smile

smile



--------------------
[color=gray]There's More Than One Way To Do It[/color]
PM MAIL WWW ICQ Skype   Вверх
smth
Дата 2.9.2005, 10:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 30.8.2005

Репутация: нет
Всего: нет



sharq Что имено тебя интересует?
Скрипт? Там более 600 отлаженных строк в общей сложности. Как вызывается fork()?

fork() || die "Cannot fork() $!";

Как вызывается Win32::Process::Create? См. выше.
Как запускается под виндой скрипт с Tk? Смотри мануал.
Что еще?

Usya Согласен. Только мне никто и ничто не мешает создать новый процесс в отдельном трэде. Причем этот процесс будет изолирован от друго такого же полностью. Т.е. сначала создаем "оболочку". В этой оболочке нет ничего, кроме создания и управления потоками. При запуске для этой "оболочки" будет создан процесс. Если дочерних процессов (потоков) нет, создается отдельный поток, в котором запускается еще один процесс, выполняющий то, что нам нужно. Если появится необходимость создать еще один процесс, то из "оболочки" создаем еще один поток и - вуаля! - у нас два независимых потока с независимыми процессами.
PM MAIL   Вверх
sharq
Дата 2.9.2005, 11:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Perl Liker
**


Профиль
Группа: Участник
Сообщений: 841
Регистрация: 13.12.2004
Где: Ростов-на-Дону

Репутация: 3
Всего: 28



Цитата(smth @ 2.9.2005, 11:36)
Что имено тебя интересует?

Мне все равно, у тебя же не работает!

Цитата(smth @ 2.9.2005, 11:36)
fork() || die "Cannot fork() $!";

Как вызывается Win32::Process::Create? См. выше.
Как запускается под виндой скрипт с Tk? Смотри мануал.

Ух ты, что прада именно так? smile



--------------------
[color=gray]There's More Than One Way To Do It[/color]
PM MAIL WWW ICQ Skype   Вверх
smth
Дата 2.9.2005, 14:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 30.8.2005

Репутация: нет
Всего: нет



sharq Если все равно, зачем спрашивать?
PM MAIL   Вверх
smth
Дата 10.11.2005, 19:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 30.8.2005

Репутация: нет
Всего: нет



smile "А ларчик просто открывался..."
Код

   system("[i]имя файла[/i]&");

PM MAIL   Вверх
Закрытая темаСоздание новой темы Создание опроса
Правила форума "Perl: Системное программирование"
korob2001
sharq
  • В этом разделе обсуждаются вопросы относящиеся только к системному программированию на Perl
  • Если ваш вопрос не относится к системному или CGI программированию, задавайте его в общем разделе
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.4457 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.