Perl 中你可以用不同的方法來建立進程。
本教程將討論一些進程的管理方法。
你可以使用特殊變數$$或$PROCESS_ID來取得進程ID。
%ENV 哈希存放了父進程,也就是shell中的環境變量,在Perl中可以修改這些變數。
exit()通常用於退出子進程,主進程在子進程全部退出後再退出。
所有開啟的句柄會在子程序中被dup() 函數複製, 所有關閉程序所有句柄不會影響其他程序。
使用反引號運算子可以輕鬆的執行Unix 指令。你可以在反引號中插入一些簡單的指令。命令執行後將傳回結果:
#!/usr/bin/perl@files = `ls -l`;foreach $file (@files){ print $file;}1;
執行以上程序,輸出結果如下:
drwxr-xr-x 3 root root 4096 Sep 14 06:46 9-14drwxr-xr-x 4 root root 4096 Sep 13 07:54 android-rw-r--r-- 1 root root 574 Sep root 574 index 17 16 .htmdrwxr-xr-x 3 544 401 4096 Jul 6 16:49 MIME-Lite-3.01-rw-r--r-- 1 root root 71 Sep 17 15:16 test.pl…
你也可以使用system()函數執行Unix 指令, 執行該指令將直接輸出結果。預設會送到目前Perl的STDOUT指向的地方,通常是螢幕。你也可以使用重定向運算子> 輸出到指定檔:
執行以上程序,輸出結果如下:
drwxr-xr-x 3 root root 4096 Sep 14 06:46 9-14drwxr-xr-x 4 root root 4096 Sep 13 07:54 android-rw-r--r-- 1 root root 574 Sep root 574 index 17 16 .htmdrwxr-xr-x 3 544 401 4096 Jul 6 16:49 MIME-Lite-3.01-rw-r--r-- 1 root root 71 Sep 17 15:16 test.pl…
你需要注意指令包含環境變數如$PATH 或$HOME 的輸出結果,如下所示:
執行以上程序,輸出結果如下:
/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin我是Perl 的變數/usr/local/bin:/bin:/usr/bin:/ usr/local/sbin:/usr/sbin:/sbin
Perl fork() 函數用於建立一個新流程。
在父進程中傳回子進程的PID,在子進程中回傳0。如果發生錯誤(例如,記憶體不足)傳回undef,並將$!設為對應的錯誤訊息。
fork 可以和exec 搭配使用。 exec 函數執行完引號中的命令後進程即結束。
執行以上程序,輸出結果如下:
透過父進程輸出透過子進程輸出2016年6月19日星期日22時21分14秒CST完成的進程ID: 47117
如果進程退出時,會向父進程發送CHLD的訊號後,就會變成僵死的進程,需要父進程使用wait和waitpid來終止。當然,也可以設定$SIG{CHLD}為IGNORG:
執行以上程序,輸出結果如下:
透過父進程輸出透過子進程輸出2016年6月19日星期日22時30分56秒CST完成的進程ID: -1
Perl kill('signal', (Process List))給予一組程序訊號。 signal是發送的數位訊號,9為殺死進程。
首先看看linux中的常用訊號,見如下列表:
訊號名值標註解釋————————————————————————————————————————————— ———————————————HUP 1 A 偵測到掛起INT 2 A 來自鍵盤的中斷QUIT 3 A 來自鍵盤的停止ILL 4 A 非法指令ABRT 6 C 失敗FPE 8 C 浮點異常KILL 9 AF 終端訊號USR1 10 A 使用者定義的訊號1SEGV 11 C非法記憶體存取USR2 12 A 使用者定義的訊號2PIPE 13 A 寫往沒有讀取者的管道ALRM 14 A 來自鬧鐘的定時器訊號TERM 15 A 終端訊號CHLD 17 B 子程序終止CONT 18 E 如果被停止則繼續STOP 19 DF 停止進程TSTP 20 D tty鍵入的停止命令TTIN 21 D 對後台進程的tty輸入TTOU 22 D對後台程序的tty輸出
以下實例向進程104 和102 發送SIGINT 訊號: