wiki:Dev/Perl

Version 1 (modified by mitty, 14 years ago) (diff)

--

fork child process on CGI

  • sample code
    #! /usr/bin/perl -w
    
    my $pid = fork;
    if (! defined $pid) {
        # cannot fork
        die("cannot fork: $!");
    }
    
    if ($pid) {
        # parent process
        print "Content-type: text/html;\n\n";
        
        # output something
        print "parent: $$ / child: $pid\n";
        
        close(STDIN);
        close(STDOUT);
        exit;
    }
    else {
        # child proccess
        close(STDIN);
        close(STDOUT);
        
        # long long proccess ...
    }
    
    • close(STDOUT)を必要と書かれている文献が多いが、手元の環境(下記)ではSTDINも閉じないと親プロセスは終了しなかった。
    • 親プロセスについてはSTDIN/STDOUTを閉じた時点でhttpdからプロセスが終了させられるので(see Tips (CGI, Perl, Unix and etc.))、exit前に何かの処理を行うことは出来ない。
    • apache2 -V
      Server version: Apache/2.2.14 (Ubuntu)
      Server built:   Apr 13 2010 20:22:19
      Server's Module Magic Number: 20051115:23
      Server loaded:  APR 1.3.8, APR-Util 1.3.9
      Compiled using: APR 1.3.8, APR-Util 1.3.9
      Architecture:   64-bit
      Server MPM:     Worker
        threaded:     yes (fixed thread count)
          forked:     yes (variable process count)