mirror of
				https://sourceware.org/git/glibc.git
				synced 2025-10-30 10:45:40 +03:00 
			
		
		
		
	
		
			
				
	
	
		
			79 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			79 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /* Using kill for Communication
 | |
|    Copyright (C) 1991-2012 Free Software Foundation, Inc.
 | |
| 
 | |
|    This program is free software; you can redistribute it and/or
 | |
|    modify it under the terms of the GNU General Public License
 | |
|    as published by the Free Software Foundation; either version 2
 | |
|    of the License, or (at your option) any later version.
 | |
| 
 | |
|    This program is distributed in the hope that it will be useful,
 | |
|    but WITHOUT ANY WARRANTY; without even the implied warranty of
 | |
|    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | |
|    GNU General Public License for more details.
 | |
| 
 | |
|    You should have received a copy of the GNU General Public License
 | |
|    along with this program; if not, if not, see <http://www.gnu.org/licenses/>.
 | |
| */
 | |
| 
 | |
| /*@group*/
 | |
| #include <signal.h>
 | |
| #include <stdio.h>
 | |
| #include <sys/types.h>
 | |
| #include <unistd.h>
 | |
| /*@end group*/
 | |
| 
 | |
| /* When a @code{SIGUSR1} signal arrives, set this variable.  */
 | |
| volatile sig_atomic_t usr_interrupt = 0;
 | |
| 
 | |
| void
 | |
| synch_signal (int sig)
 | |
| {
 | |
|   usr_interrupt = 1;
 | |
| }
 | |
| 
 | |
| /* The child process executes this function. */
 | |
| void
 | |
| child_function (void)
 | |
| {
 | |
|   /* Perform initialization. */
 | |
|   printf ("I'm here!!!  My pid is %d.\n", (int) getpid ());
 | |
| 
 | |
|   /* Let parent know you're done. */
 | |
|   kill (getppid (), SIGUSR1);
 | |
| 
 | |
|   /* Continue with execution. */
 | |
|   puts ("Bye, now....");
 | |
|   exit (0);
 | |
| }
 | |
| 
 | |
| int
 | |
| main (void)
 | |
| {
 | |
|   struct sigaction usr_action;
 | |
|   sigset_t block_mask;
 | |
|   pid_t child_id;
 | |
| 
 | |
|   /* Establish the signal handler. */
 | |
|   sigfillset (&block_mask);
 | |
|   usr_action.sa_handler = synch_signal;
 | |
|   usr_action.sa_mask = block_mask;
 | |
|   usr_action.sa_flags = 0;
 | |
|   sigaction (SIGUSR1, &usr_action, NULL);
 | |
| 
 | |
|   /* Create the child process. */
 | |
|   child_id = fork ();
 | |
|   if (child_id == 0)
 | |
|     child_function ();		/* Does not return.  */
 | |
| 
 | |
| /*@group*/
 | |
|   /* Busy wait for the child to send a signal. */
 | |
|   while (!usr_interrupt)
 | |
|     ;
 | |
| /*@end group*/
 | |
| 
 | |
|   /* Now continue execution. */
 | |
|   puts ("That's all, folks!");
 | |
| 
 | |
|   return 0;
 | |
| }
 |