有关perl的fork和父子进程间共享数据的知识,感兴趣的朋友可以参考下。
fork()函数:
作用:进程复制函数。
用法:$pid=fork();
讲解:
无参数;当本进程为父进程时返回值为子进程的PID值,当进程为子进程时返回值为0。
实例:
分析实例:
楼上的程序没有父进程与子进程的明显分化,要将它们分开就要靠测试$pid的值,所以对fork()函数的调用来说条件语句是非常重要的,需要通过它们来辨别fork()的返回值。
注:fork()函数:
Does a fork(2) system call to create a new process running the same program at the same point.
fork以后,子进程从fork点开始和主进程运行相同的程序,所以可以通过测试$pid来使主进程和子进程运行不同的程序,子进程所做的工作结束后应该退出,不然会继续运行if代码块以后的父进程的程序,这样会运行两次父进程的程序。
#!/usr/bin/perl -w
my $pid = fork();
if ($pid != 0) {
print "is parentn";
} else {
# this is the child process
print "is childn"; #子进程退出,会继续运行if一下的程序。
}
print 'program after "if"'."n" #会打印两次,一次是父进程打印,一次是子进程打印的。
#!/usr/bin/perl -w
my $pid = fork();
if ($pid != 0) {
print "is parentn";
} else {
# this is the child process
print "is childn";
exit 0; #子进程退出,不会运行if以后的程序
}
print 'program after "if"'."n" #只有父进程打印一次
pipe():创建管道对。
格式: pipe(READ,WRITE);
The pipe function creates two connected filehandles, a reader and writer, whereby anything written to the writer can be read from the reader.(摘自《perl cookbook》)
pipe创建两个连接的句柄,一个读,一个写,任何写入到writer的都可以从reader中读出。
实 例:pipe(README,WRITEME); #创建了一个管道对,"README"用于读,"WRITEME"用于写。
$aaa=pipe(AAA,BBB); #创建了一个管道对,"AAA"用于读,"BBB"用于写,$aaa变量为调用pipe()的返回值。
讲解:正常调用后返回值为非零数,第一个参数为被创建的读管道,第二个参数为被创建的写管道。此函数通常配合进程中 的fork()函数一同使用,步骤是先使用pipe()函 数建立管道对,再使用fork()创建新进程,在不同的进程关闭不同的管道,这样就可以达到管道间通信的目的了。
close(): 关闭管道
格式: close(AAA);
close BBB;
讲 解:close()在调用时能将子程序的终止代码放到特殊变量$?中;当关闭的是写管道时close()调用将进入堵塞状态直至另一端完成它的 全部工作为止。
子进程通过父进程获得输入
#!/usr/bin/perl -w
my $uid ="test 123";
pipe(CHILD_RDR, PARENT_WTR);
my $pid = fork();
if ($pid != 0) {
#this is parent process
close CHILD_RDR;
print PARENT_WTR "$uid";
} else {
# this is the child process
close PARENT_WTR;
$u = <CHILD_RDR>;
print $u;
}
父进程通过子进程获得输入
#!/usr/bin/perl -w
my $uid ="test 123";
pipe(PARENT_RDR, CHILD_WTR);
my $pid = fork();
if ($pid == 0) {
#this is child process
close PARENT_RDR;
print CHILD_WTR "$uid";
} else {
# this is the parent process
close CHILD_WTR;
$u = <PARENT_RDR>;
print $u;
}
子进程和父进程双向通信,请参考:
http://perldoc.perl.org/perlipc.html#Bidirectional-Communication-with-Yourself
改进版: