SIGCHLD信号问题

缺心少肺 2017-02-22 10:06:26
在父进程利用变量++记录子进程个数,并在收到SIGCHLD信号之后--,为什么跑时间久后变量值会变为负值 giConn = 0?代码如下
sighold(SIGCLD);
if((iChildpid=fork())<0)
{
AppTrace(TRACE_LEVEL_ERRMSG,TRACE_INFO,errno,"fork Error. [%s]\n", strerror(errno) );
sigrelse(SIGCLD);
sleep(1);
continue;
}
else if (iChildpid==0) /** CHILD PROCESS **/
{
sigset(SIGCLD, SIG_DFL);
sigset(SIGUSR1, SIG_DFL);
close(iSockfd);
DealIt(iNewSockfd, lCliAddr);
} /* end of if */
giConn++;
close(iNewSockfd);
sigrelse(SIGCLD);

void wake_up(int sig)
{
/* AppTrace(TRACE_LEVEL_DEBUG,TRACE_INFO,0,"Got Signal."); */
while(waitpid((pid_t)(-1), (int *)0, WNOHANG|WUNTRACED) >0)
giConn--;
} /*

...全文
179 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
溢出了呗,你的变量定义的是有符号数
LubinLew 2017-02-22
  • 打赏
  • 举报
回复
你给的代码缺少逻辑流程,我写了一个例子,你参考一下

#define _XOPEN_SOURCE
#define _XOPEN_SOURCE_EXTENDED

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/wait.h>


static int giConn = 0;

/*
WNOHANG     return immediately if no child has exited.
WUNTRACED	  also return if a child has stopped (but not traced via ptrace(2))
*/
void wake_up(int sig)
{
	pid_t pid = 0;
	int status = 0;
	while((pid = waitpid(-1, &status, WNOHANG|WUNTRACED)) > 0) {
		giConn--;
		printf("==child %d die because %s, remain %d\n", pid, status?"error":"end", giConn);
	}
}

int create_child(void)
{
	pid_t pid;
	pid = fork();
	if (pid < 0) {
		perror("fork failed");
	}
	else if (0 == pid) {//child
		sleep(1);//do something
		exit(0);
	}
	else {//parent
		giConn++;
		printf("==child %d create, total is %d\n", pid, giConn);
	}
}


int main(void)
{
	int i = 0;
	
	sighold(SIGCLD); //receive SIGCLD signal
	sigset(SIGCLD, wake_up);

	for (i = 0; i < 10; i++) {
		create_child();
	}

	printf("++++++++parent wait...\n");
	while (getchar() != '\n');//press Enter to Exit the process
	printf("++++++++parent end...\n");
	exit(0);
}


23,125

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧