How to use fork() in unix? Why not something of the form fork(pointerToFunctionToRun)?

前端 未结 8 2117
盖世英雄少女心
盖世英雄少女心 2021-02-06 05:01

I am having some trouble understanding how to use Unix\'s fork(). I am used to, when in need of parallelization, spawining threads in my application. It\'s always s

相关标签:
8条回答
  • 2021-02-06 05:47

    You fork whenever you want to more than one thing at the same time. It’s called multitasking, and is really useful.

    Here for example is a telnetish like program:

    #!/usr/bin/perl
    use strict;
    use IO::Socket;
    my ($host, $port, $kidpid, $handle, $line);
    
    unless (@ARGV == 2) { die "usage: $0 host port" }
    ($host, $port) = @ARGV;
    
    # create a tcp connection to the specified host and port
    $handle = IO::Socket::INET->new(Proto     => "tcp",
                                    PeerAddr  => $host,
                                    PeerPort  => $port)
           or die "can't connect to port $port on $host: $!";
    
    $handle->autoflush(1);              # so output gets there right away
    print STDERR "[Connected to $host:$port]\n";
    
    # split the program into two processes, identical twins
    die "can't fork: $!" unless defined($kidpid = fork());
    
    if ($kidpid) {                      
        # parent copies the socket to standard output
        while (defined ($line = <$handle>)) {
            print STDOUT $line;
        }
        kill("TERM" => $kidpid);        # send SIGTERM to child
    }
    else {                              
        # child copies standard input to the socket
        while (defined ($line = <STDIN>)) {
            print $handle $line;
        }
    }
    exit;
    

    See how easy that is?

    0 讨论(0)
  • 2021-02-06 05:49

    It is worth noting that multi-processing not exactly the same as multi-threading. The new process created by fork share very little context with the old one, which is quite different from the case for threads.

    So, lets look at the unixy thread system: pthread_create has semantics similar to CreateNewThread.

    Or, to turn it around, lets look at the windows (or java or other system that makes its living with threads) way of spawning a process identical to the one you're currently running (which is what fork does on unix)...well, we could except that there isn't one: that just not part of the all-threads-all-the-time model. (Which is not a bad thing, mind you, just different).

    0 讨论(0)
提交回复
热议问题