There is code in "execute_cmd.c" function "execute_command_internal":
...
#if defined (RECYCLES_PIDS)
       last_made_pid = NO_PID;
#endif
       last_pid = last_made_pid;
...
       if (already_making_children && pipe_out == NO_PIPE &&
           last_made_pid != last_pid)
         {
...
             exec_result = wait_for (last_made_pid);
         }
I'm wondering why we are doing assignment (last_pid = last_made_pid;) 
and then test it (&& last_made_pid != last_pid)?
I understand we create new child process and change last_made_pid. So, 
for example, we have last_pid 255, same as last_made_pid. Now we create 
child process and change last_made_pid to that new (256 probably). Now 
we test if they are same, they aren't and we wait for child. But what 
about situating where we have a lot of process'? 32768... last_pid will 
be 32768, make new child with pid 32769, we go through if, wait for 
child. Now we do next command, last_pid will change to 32769, create 
child, but this child will have pid 32769 and we don't go through if and 
don't wait to child.
It's done by kernel, but why is bash doing this check? Is it necessary? 
Isn't enough to check like this: if (already_making_children && pipe_out 
== NO_PIPE)? Or get a rid of #if defined (RECYCLES_PIDS) and do 
last_made_pid = NO_PID; every time? For me is better solution the 
lighter checking.

Reply via email to