• Posts
  • RSS
  • ◂◂RSS
  • Contact

  • A function that returns twice: fork()

    December 6th, 2012
    tech  [html]
    Generally a function returns once:
      random_boolean() {
        // seed our random number generator with the current time
        srand(time(0));
        // return true half the time, false half the time
        return rand() % 2;
      }
    
      main() {
        if (random_boolean())
          printf("true");
        else
          printf("false");
      }
    
    This will print either "true" or "false", depending on what random_boolean() returns. [1] But it doesn't have to be this way:

      random_boolean() {
        return fork();
      }
    
      main() {
        if (random_boolean())
          printf("true");
        else
          printf("false");
      }
    
    This will print both "true" and "false": fork() returns twice. What's going on? When a program calls fork() the operating system clones it, returning true to the original and false to the clone [2]. The flow of control splits. You might wonder: what if I ran a program like:
      main() {
        while (1)
          fork();
      }
    
    Roughly, each time through the loop we double the number of processes. That should exponentially create processes, which might be bad. As it happens, several years ago I did wonder about this. To find out, I wrote a program, and discovered that it is in fact quite bad, crashing my machine extremely quickly. After which I moved on until one evening about a year later when everyone in my operating systems class was trying to finish a project due at midnight. Working remotely, ssh'ed from my edge-of-campus dorm into the cs department's login server (which was also the primary file server), I ran ~/a.out when I meant to run ./a.out. This took down every computer in the department:
      From: Jeff Kaufman
      To: Swarthmore CS Department Sysadmin
      Date: Sun, 18 Sep 2005 21:00:59 -0400 (EDT)
      Subject: Allspice accidental downtime
    
      I accidentally ran a fork bomb on Allspice, making it was unusable
      at user level for about 25 minutes.  The fork bomb was sitting (very
      stupidly) in my home directory as a.out, left over from messing
      around with it almost a year ago.  I then ran ~/a.out instead of
      ./a.out.  Much badness ensued.  Mary had keys to the server room, so
      we came down to the science center and rebooted allspice.
    
      Everything seems to be ok now.
    
      Multitudinous apologies,
         Jeff
    
      PS: perhaps this makes a good case for ulimits?
    
    Arriving at the science center to fix the problem I had created, my classmates were pretty unhappy with me.

    After this we shifted remote logins to go to random lab machines via round-robin dns instead of to the central server.


    [1] While gcc will compile this code as written, you shouldn't actually write C like this. I'm writing tersely to keep the important stuff from drowning in the verbosity of C.

    [2] Technically it returns 0 to the clone and the process id of the clone to the original. Which are usually called parent and child. Minor details.

    Comment via: google plus, facebook

    Recent posts on blogs I like:

    Fireside Friday, November 27, 2020

    Hey folks! Fireside this week. A bit of a change-up in terms of the coming attractions. I had planned to start “Textiles, How Did They Make It?” next, but I want to do a bit more reading on some of the initial stages of textile production (that is, the pr…

    via A Collection of Unmitigated Pedantry November 27, 2020

    Building Depth and Window Space

    How much window space does an apartment need, relative to its area, and how does this affect building style? A fascinating post from about a year ago on Urban Kchoze makes the argument that modern North American buildings are too deep – Simon calls them o…

    via Pedestrian Observations November 27, 2020

    Thoughts you mightn't have thunk about remote meetings

    Welcome to this week's edition of "building a startup in 2020," in which all your meetings are suddenly remote, and you probably weren't prepared for it. I know I wasn't. We started a "fully remote" company back in 2019, but …

    via apenwarr November 23, 2020

    more     (via openring)


  • Posts
  • RSS
  • ◂◂RSS
  • Contact