Hi Mark,

Aha, that explains the results.  That c program and the cl compiler
were only used as a way of showing the difference in process ids. The
script I am trying to port to run on Windows under cygwin does not
really compile C and really needs to run native Windows programs.

Anyhow, thank you very much for a quick reply.

Vadym

On Wed, 8 Oct 2025 at 06:54, Mark Geisert via Cygwin <[email protected]> wrote:
>
> Hi Vadym,
>
> On 10/7/2025 4:38 AM, Vadym Krevs via Cygwin wrote:
> > Hi.
> >
> > I've a question regarding job control in cygwin bash.
> >
> > Below is a simple program that prints out the process id of itself.
> >
> >      C:\builds>cat a.c
> >      #include <stdio.h>
> >      #include <process.h>
> >
> >      int main(int argc, char ** argv)
> >      {
> >              printf("pid=%d\n", _getpid());
> >              return 0;
> >      }
> >
> > Compiling and running it in foreground from cygwin bash works as expected:
> >
> >      user@host /cygdrive/c/builds
> >      $ cl a.c
> >      Microsoft (R) C/C++ Optimizing Compiler Version 19.44.35217 for x86
> >      Copyright (C) Microsoft Corporation.  All rights reserved.
> >
> >      a.c
> >      Microsoft (R) Incremental Linker Version 14.44.35217.0
> >      Copyright (C) Microsoft Corporation.  All rights reserved.
> >
> >      /out:a.exe
> >      a.obj
> >
> >      user@host /cygdrive/c/builds
> >      $ ./a
> >      pid=2352
> >
> >
> > However, if I start it in background and attempt to get back the pid
> > of the started process via $!, the result is not what one would
> > expect. The actual process pid printed out from my program differs
> > from what cygwin bash thinks is "process ID of the job most recently
> > placed into the background".
> >
> >      user@host /cygdrive/c/builds
> >      $ ./a &
> >      [1] 15909
> >
> >      user@host /cygdrive/c/builds
> >      $ pid=27008
> >      echo $!
> >      15909
> >      [1]+  Done                    ./a
> >
> >
> > So my question is - is this a cygwin bash quirk (i.e. the fact that $!
> > is not the pid of the started process) caused by how fork/process
> > startup is implemented in cygwin? I have tried reading
> > https://cygwin.com/cygwin-ug-net/highlights.html#ov-hi-process but
> > could not see anything relevant aside from "Job control works as
> > expected in shells that support it." in the Signals section. Is there
> > any way to get the actual process pid?
>
> You are using cl to create the executable, and doing so means it results
> in a native Windows program, not a Cygwin program.  Running ldd.exe on
> your executable will show the Cygwin DLL is not associated.
>
> If you instead use gcc to create the executable, this testcase works
> correctly.  Try 'gcc a.c', assuming you have gcc installed (via Cygwin
> Setup Program).  You will also have to change "<process.h>" to
> "<unistd.h" and "_getpid" to "getpid" in your source file first.
> HTH,
>
> ..mark
>
> --
> Problem reports:      https://cygwin.com/problems.html
> FAQ:                  https://cygwin.com/faq/
> Documentation:        https://cygwin.com/docs.html
> Unsubscribe info:     https://cygwin.com/ml/#unsubscribe-simple

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

Reply via email to