Bash doesn't launch the applications directly.

Lenik len1@bodz.net
Fri Jan 16 04:22:00 GMT 2009



"Eric Blake" <ebb9@byu.net> 写å
¥æ¶ˆæ¯ news:496F34BB.6080200@byu.net...
> -----BEGIN PGP SIGNED MESSAGE-----
> Hash: SHA1
>
> According to Lenik on 1/14/2009 5:59 PM:
>> Hi, all
>>
>> I noticed that when bash launches a program, for example win32
>> notepad.exe or cygwin sleep, it in fact launches another bash which
>> launches the final program,
>>
>> Any idea?
>
> Yes.  It's called forking (a concept that Windows does not have natively,
> but which cygwin does a LOT of work to emulate).  The way Unix apps
> (including bash) start another program is to first fork themselves, then
> in that fork, exec the target program.  The fork accounts for the second
> bash process.
>
> Depending on the nature of the called process, you might also see those
> additional processes stick around.  If the child is a cygwin process (like
> sleep), exec() is decently emulated, where the forked bash goes away and
> you are left with only one running sleep process.  But if it is a windows
How fast does the emulation implemented?

> process (like notepad), cygwin has to insert a shim process in between to
> handle signal handling in order to abort notepad if you type ctrl-c in
> bash, as well as collect the correct exit status.
Is there any option to disable the shim process?

I have tried to launch notepad in background:
  # calc &
In such situation, we won't ever press ctrl-c or ctrl-z, (maybe until fg 
%1), but there still got 2 bash processes. If I just want to send the launch 
signal to win32, and don't care what if user press ctrl-c in the bash.

I tried `cygstart `which notepad`', this did launch another bash, too (while 
it launches cygstart.exe and which.exe additionally). Though the cygstart 
and shim are then immediately terminated, but it cost the launching time.

>
> Ultimately, bash could be made faster by using posix_spawn() instead of
> fork(), for much of what it does.  However, that would require 1) an
> upstream patch to bash to use posix_spawn(), including a fallback
> implementation of posix_spawn on platforms that don't yet implement it
> (such an implementation is possible, since gnulib already provides one,
> but the upstream maintainer is hard to convince, and even if the patch
> existed, it has already missed the bash 4.0 cutoff), and 2) an
> implementation of posix_spawn() in cygwin that directly spawns processes
> using native Windows concepts (the bash fallback implementation of
> posix_spawn() would still end up using fork() under the hood, giving no
> speedups until we have a native version).  http://cygwin.com/acronyms/#PTC
>
Is it possible to make cygstart as a bash built-in? And thus will get 
another benefit that after cygstart.exe terminated, the parent-children 
relationship between the bash and notepad can be maintained.

Lenik 



--
Unsubscribe info:      http://cygwin.com/ml/#unsubscribe-simple
Problem reports:       http://cygwin.com/problems.html
Documentation:         http://cygwin.com/docs.html
FAQ:                   http://cygwin.com/faq/



More information about the Cygwin mailing list