RE: kill(pid, 0) issue

2003-12-18 Thread Nowakowski Maciej-AMN011

 -Original Message-
 From: Christopher Faylor 
 Sent: Wednesday, December 17, 2003 6:27 PM
 To: [EMAIL PROTECTED]
 Subject: Re: kill(pid, 0) issue
 
 
 On Wed, Dec 17, 2003 at 05:23:20PM +0100, Nowakowski 
 Maciej-AMN011 wrote:
 My application creates additional process using fork() function. 
 Created child process listens on a socket and exits when it receives 
 anything.  The main process checks the child PID using kill(pid, 0) 
 with child PID as a parameter.  Even when the child has exited this 
 function call returns 0.  When I have supplied any PID which hasn't 
 ever existed it's fine and kill(non-existentPID, 0) returns -1.
 
 Has anyone experienced something like this?
 
 This seems like a perfect place for a simple test case.  For instance:
 
 #include stdio.h
 #include stdlib.h
 #include signal.h
 #include unistd.h
 #include sys/wait.h
 
 int
 main (int argc, char **argv)
 {
   int pid;
   if (argv[1])
 pid = atoi(argv[1]);
   else if ((pid = fork ()) == 0)
 {
   puts (forking a process and then exiting);
   exit (0);
 }
   else
 {
   int dummy;
   wait (dummy);
 }
   printf (%d = kill (%d, 0)\n, kill (pid, 0), pid);
   exit (0);
 }
 
 I tried the above with no argument and with an argument of a 
 previously forked-and-exited process.  Both cases produced 
 the expected result, as did trying this on a running process.
 
 I suspect that you are not 'wait()'ing for the process to 
 exit before checking if it exists.  kill(pid, 0) will succeed 
 on both linux and cygwin if the process is not reaped by 
 calling wait (or waitpid, etc.) first.
 
 cgf
 

Christopher,

Thanks for a reply. I have run your test case and it really works.
So then I have modified it slightly to make it similar to what my 
application is doing. Now it reproduces the behaviour of my app. 
I'm running this test below in a Windows console and using Cygwin 
console to display processes issuing 'ps' command. I have expected
the child process to be finished after some time(when main process
is blocked on 'getc()') but kill(pid, 0) returns 0.

Probably there is an issue lying beneath I'm not aware of.

#include stdio.h
#include stdlib.h
#include signal.h
#include unistd.h
#include sys/wait.h

static void ChildExitSigHandle(int sig)
{
  printf (Child termination signal received...\n);
}

int
main (int argc, char **argv)
{
  int pid;
  
  signal(SIGCHLD, ChildExitSigHandle);
  
  if (argv[1])
pid = atoi(argv[1]);
  else if ((pid = fork ()) == 0)
{
  puts (forking a process and then exiting);
  exit (0);
}
  else
{
  //int dummy;
  //wait (dummy);
  getc(stdin);
}
  printf (%d = kill (%d, 0)\n, kill (pid, 0), pid);
  exit (0);
}

Regards,

Maciek

--
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/



RE: kill(pid, 0) issue

2003-12-18 Thread Nowakowski Maciej-AMN011
Yes you are right I somehow missed the sentence:

kill(pid, 0) will succeed on both linux and 
cygwin if the process is not reaped by calling wait (or waitpid, etc.) 
first.

Thanks,

Maciek

--
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/



kill(pid, 0) issue

2003-12-17 Thread Nowakowski Maciej-AMN011
Hi all,

My application creates additional process using fork() function. Created child process 
listens on a socket and exits when it receives anything. The main process checks the 
child PID using kill(pid, 0) with child PID as a parameter. Even when the child has 
exited this function call returns 0. When I have supplied any PID which hasn't ever 
existed it's fine and kill(non-existentPID, 0) returns -1.

Has anyone experienced something like this?

I'm using Cygwin 1.5.5 version(DLL version).

Regards,

MacNowak

P.S. For now I'm using kill(pid, SIGCONT) as a workaround.

--
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/