2009-10-20 4 views
2

В Perl, не используя библиотеку Thread, какой самый простой способ вызвать системный вызов, чтобы он не блокировался? Можете ли вы это сделать, избегая также fork()?В Perl, как я могу сделать неблокирующий системный вызов?

EDIT Уточнение. Я хочу избежать явного и беспорядочного вызова вилки.

+0

Какая ОС/платформа? –

+0

Я использую linux. –

+1

Вилка - это идиома ОС для процессов - нет причин избегать разветвления на системах nix. Но всегда есть основания для инкапсуляции и гомогенизации точек доступа. – Axeman

ответ

9

Вы имеете в виду это?

system('my_command_which_will_not_block &'); 

Как Крис Kloberdanz указывает, это будет вызывать вилку() неявно - там действительно нет другого способа для Perl, чтобы сделать это; особенно если вы хотите, чтобы интерпретатор perl продолжал работать во время выполнения команды.

& персонаж в команде является оболочкой мета-символ - Perl видит это и передает аргумент system() к оболочке (обычно Баш) для выполнения, а не работает непосредственно с execv() вызова. & снова сообщает bash, чтобы запустить fork, запустить команду в фоновом режиме и немедленно выйти, возвращая управление perl, пока команда продолжает выполняться.

+0

Не система неявно использует fork(), хотя? –

+0

Уточнение. Я хочу избежать явного и беспорядочного вызова вилки. –

+1

** Вздох ** Я * угадаю * «неблокирующий системный вызов» * может * означать это. –

4

Сообщение выше говорит, что «нет другого пути для perl, чтобы это сделать», что неверно.

Поскольку вы упомянули удаление файла, взгляните на IO::AIO. Это выполняет системные вызовы в другом потоке (поток POSIX, а не Perl pseudothread); вы планируете запрос с aio_rmtree, и когда это будет сделано, модуль вызовет функцию в вашей программе. Тем временем ваша программа может делать все, что захочет.

Выполнение вещей в другой потоке POSIX на самом деле является в целом полезной техникой. (Специальная взломанная версия). Coro использует его для выгрузки сопрограмм (срезания времени), а EV :: Loop :: Async использует его для доставки уведомлений о событиях, даже если Perl делает что-то другое, кроме ожидания событий.