Управление процессами ОС от Erlang - PullRequest
2 голосов
/ 24 апреля 2011

Как лучше всего управлять процессами в ОС от Erlang?Мне нужно иметь возможность порождать процессы дочерней ОС, записывать в дочерний стандарт, читать как из stdout, так и из stderr, отправлять сигналы уничтожения и получать уведомления о кодах выхода.Я не вижу, что это возможно с ошибками.

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

Ответы [ 2 ]

3 голосов
/ 27 апреля 2011

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

Порт Драйверы отличаются друг от друга, и в случае их неправильного поведения может произойти сбой всей виртуальной машины Erlang.

2 голосов
/ 27 апреля 2011

В Erlang стандартным способом управления процессами ОС является порты .

Состояние выхода порожденного процесса ОС будет отправлено в виде сообщения, если опция exit_status добавлена ​​в open_port :

1> P = open_port({spawn, "/bin/ls unknown_file_name"}, [exit_status]).
#Port<0.486>
/bin/ls: cannot access unknown_file_name: No such file or directory
2> flush().
Shell got {#Port<0.486>,{exit_status,2}}
ok

Данные могут быть записаны в stdin порожденного процесса ОС, отправив сообщение в порт или с помощью функции port_command , и содержимое stdout будет отправлено в виде сообщения.(Обратите внимание также {line, L} и {packet, N} опции open_port):

1> P = open_port({spawn, "/bin/cat"}, [stream, binary]).
#Port<0.486>
2> true = port_command(P, <<"data">>).
true
3> flush().
Shell got {#Port<0.486>,{data,<<"data">>}}
ok
4> true = port_close(P).
true

Stderr также может быть перенаправлен на стандартный вывод:

1> P = open_port({spawn, "/bin/ls unknown_file_name"}, [stderr_to_stdout, binary]).
#Port<0.486>
2> flush().
Shell got {#Port<0.486>,
    {data,<<"/bin/ls: cannot access unknown_file_name: No such file or directory\n">>}}
ok

Однако вы не можете отправить killсигналы с портами, но если вы закроете порт, отправив сообщение в порт или вызвав port_close , внешний процесс может выйти с помощью сигнала SIGPIPE .

...