Beispiel #1
0
int main(int argc, char const *argv[])
{
	int status;
	pid_t child_pid;

	switch(fork())
	{
		case -1:
			printf("创建子进程失败\n");
			exit(EXIT_FAILURE);
		case 0:    // 子进程
			printf("子进程开始运行, PID:%ld\n", (long)getpid());
			if(argc > 1)
				exit(atoi(argv[1]));
			else
			{
				for(;;)
					pause();
			}
			exit(EXIT_FAILURE);
		default:
			/**
			 * 检测子进程的状态
			 * 如果子进程的状态没有发生改变,立即返回
			 * 子进程收到信号停止也会返回
			 */
			for(;;)
			{
				child_pid = waitpid(-1, &status, WUNTRACED
#ifdef WCONTINUED
				| WCONTINUED
#endif
				);

				if(child_pid == -1)
				{
					printf("waitpid调用失败\n");
					exit(EXIT_FAILURE);
				}

				printf("waitpid() 返回: PID=%ld; status=0x%04x (%d, %d)\n", (long)child_pid, (unsigned int)status, status>>8, status&0xff);

				print_wait_status(NULL, status);

				if(WIFEXITED(status) || WIFSIGNALED(status))
				{
					exit(EXIT_SUCCESS);
				}
			}

	}

	return 0;
}
Beispiel #2
0
int
main (void)
{
	struct sigaction sa;
	sigset_t sigMask;
	pid_t chldPid;
	int status;

	// establish handler for SIGCHLD
	sigemptyset (&sa.sa_mask);
	sa.sa_flags = 0;
	sa.sa_handler = signal_handler;
	sigaction (SIGCHLD, &sa, NULL);

	// block SIGCHLD
	sigemptyset (&sigMask);
	sigaddset (&sigMask, SIGCHLD);
	sigprocmask (SIG_BLOCK, &sigMask, NULL);

	switch (chldPid = fork ()) {
		case -1:
			perror ("fork()");
			return 1;

		case 0: // child
			_exit (0);

		default:
			// wait for child to exit
			sleep (2);

			// unblock SIGCHLD
			sigprocmask (SIG_UNBLOCK, &sigMask, NULL);

			waitpid (chldPid, &status, 0);
			print_wait_status (status);
			break;
	}

	return 0;
}
Beispiel #3
0
static void sig_child_handler(int sig)
{
	int status, saved_errno;
	pid_t child_pid;

	/* UNSAFE: This handler uses non-async-signal-safe functions 
	 * (printf(), print_wait_status(), curr_time())
	 */
	 saved_errno = errno; /* In case we modify 'errno' */
	 printf("%s handler: Caught SIGCHLD\n", curr_time("%T"));

	 while((child_pid = waitpid(-1, &status, WNOHANG)) > 0)
	 {
	 	printf("%s handler: Reaped child %ld - ", curr_time("%T"), (long)child_pid);
	 	print_wait_status(NULL, status);
	 	num_live_children--;
	 }
	 if (child_pid == -1 && errno != ECHILD)
	 	err_msg("waitpid");

	 printf("%s handler: return\n", curr_time("%T"));
}
Beispiel #4
0
int
main (void)
{
	int ret;

#if (DONT_HANDLE_SIGCHLD == 0)
	struct sigaction sa;

	// don't care about zombies
	sigemptyset (&sa.sa_mask);
	sa.sa_flags = 0;
	sa.sa_handler = SIG_IGN;
	sigaction (SIGCHLD, &sa, NULL);
#endif

	ret = system ("sleep 3");
	if (ret == -1) {
		perror ("system()");
		return 1;
	}
	print_wait_status (ret);

	return 0;
}