本文介绍了waitpid函数,WNOHANG和SIGCHLD实例的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我需要 waitpid函数
, WNOHANG
的例子, SIGCHLD
组合在C,以及如何使用它们所有脱颖而出\\背景是什么?
信号(SIGCHLD,SIG_IGN); waitpid函数(儿童,状态,0);
解决方案
从http://voyager.deanza.edu/~perry/sigchld.html
的#include<&stdio.h中GT; / ************处理SIGCHLD! ****************** /
#包括LT&;&signal.h中GT;
#包括LT&;&unistd.h中GT;
#包括LT&;&stdlib.h中GT;
#包括LT&; SYS / wait.h> / *****对于waitpid函数。 ***** /
#包括LT&;&SETJMP.H GT; / *****对于此时sigsetjmp和siglongjmp。 ***** /sigjmp_buf ENV;
主要()
{
将为pid_t PID;
INT N = 20;
结构sigaction的SA;
无效delete_zombies(无效); sigfillset(安培; sa.sa_mask);
sa.sa_handler = delete_zombies;
sa.sa_flags = 0;
的sigaction(SIGCHLD,&安培; SA,NULL); 此时sigsetjmp(ENV,1);
如果((PID =叉())℃,)
{
PERROR(坏叉!);
出口(1);
} 如果(PID大于0)/ *****父***** /
{
的printf(创建子%ld的\\ n,PID);
睡眠(N - = 2);
杀(0,SIGKILL);
}
否则/ ***** *****儿童/
{
睡眠(2);
出口(0); / ******这里没有必要,但... ****** /
}
}
无效delete_zombies(无效)
{
将为pid_t kidpid;
INT状态; 的printf(内部僵尸的删除:);
而((kidpid = waitpid函数(-1,&放大器;状态,WNOHANG))大于0)
{
的printf(儿童%LD终止\\ n,kidpid);
}
siglongjmp(ENV,1);
}
I need an example of waitpid
, WNOHANG
and SIGCHLD
combined in C, and how I can use them all with fore\background?
signal( SIGCHLD, SIG_IGN );
waitpid(child, status, 0);
解决方案
Taken from http://voyager.deanza.edu/~perry/sigchld.html
#include <stdio.h> /************ Handling SIGCHLD!! ******************/
#include <signal.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h> /***** For waitpid. *****/
#include <setjmp.h> /***** For sigsetjmp and siglongjmp. *****/
sigjmp_buf env;
main()
{
pid_t pid;
int n = 20;
struct sigaction sa;
void delete_zombies(void);
sigfillset(&sa.sa_mask);
sa.sa_handler = delete_zombies;
sa.sa_flags = 0;
sigaction(SIGCHLD, &sa, NULL);
sigsetjmp(env, 1);
if ((pid = fork()) < 0)
{
perror("Bad fork!");
exit(1);
}
if (pid > 0) /***** Parent *****/
{
printf("Created child %ld\n", pid);
sleep(n -= 2);
kill(0, SIGKILL);
}
else /***** Child *****/
{
sleep(2);
exit(0); /****** Not necessary here but... ******/
}
}
void delete_zombies(void)
{
pid_t kidpid;
int status;
printf("Inside zombie deleter: ");
while ((kidpid = waitpid(-1, &status, WNOHANG)) > 0)
{
printf("Child %ld terminated\n", kidpid);
}
siglongjmp(env,1);
}
这篇关于waitpid函数,WNOHANG和SIGCHLD实例的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!