- 论坛徽章:
- 0
|
本帖最后由 kelvenchi 于 2013-04-01 10:10 编辑
问题已解决,代码如下:- #! /usr/bin/perl
- use strict;
- use warnings;
- use threads 'exit' => 'thread_only';
- use threads::shared;
- use Socket;
- use Thread::Semaphore;
- use Thread::Queue;
- if (my $pid = fork) {
- exit;
- } elsif ($pid = fork) {
- setpgrp;
- exit;
- } else {
- my $fd = Thread::Queue->new();
- my $rabbish = Thread::Queue->new();
- my $sem = Thread::Semaphore->new(100000);
- my $lis = threads->create(\&boss);
- my $jt = threads->create(\&joinThread);
- sub worker {
- $sem->down;
- my $fino = $fd->dequeue;
- my @in;
- open my $fhh, "<tserver.pl" or die "$!";
- @in = <$fhh>;
- close $fhh or die "$!";
- open my $fh, ">&=$fino" or die "$!"; # 在这里把文件描述符,重新打开为文件句柄
- while (@in) {
- my $single = shift @in;
- print $fh "$single";
- }
- print $fh "this message is from the server and the tid is " . threads->self->tid . "\n";
- close $fh or die "$!";
- $sem->up;
- exit 1;
- }
- sub joinThread {
- while (my $j = $rabbish->dequeue()) {
- $j->join;
- }
- exit 1;
- }
- sub boss {
- socket Server, AF_INET, SOCK_STREAM, getprotobyname 'tcp';
- setsockopt Server, SOL_SOCKET, SO_REUSEADDR, 1;
- my $paddr = sockaddr_in 8001, INADDR_ANY;
- bind Server, $paddr;
- listen Server, SOMAXCONN;
- while (accept my $Client , Server) {
- select ((select($Client), $| = 1)[0]);
- $rabbish->enqueue(threads->create(\&worker));
- $fd->enqueue(fileno $Client); # 这里把文件句柄转换成文件描述符
- }
- exit 1;
- }
- $lis->join;
- $jt->join;
- }
复制代码 守护进程 |
|