当前位置: 技术问答>linux和unix
怎么子进程关不掉?另外怎样判断在某一个sock可读的情况下数据的长度不为零(有数据)
来源: 互联网 发布时间:2015-01-17
本文导语: 我的部分代码如下:(我在SCO 下实现,长连接,是服务端) if (FD_ISSET(sockfd,&allset)) { printf("========= sock=%d can read ====================n",sockfd); idealtime[i]=firsttm; if ((child=fork())==0)//////////getppid()获得父进...
我的部分代码如下:(我在SCO 下实现,长连接,是服务端)
if (FD_ISSET(sockfd,&allset))
{
printf("========= sock=%d can read ====================n",sockfd);
idealtime[i]=firsttm;
if ((child=fork())==0)//////////getppid()获得父进程的ID
{
close(listenfd);
//msgid 为消息队列的描述符Pbuf为一个结构,该函数实现从sockfd读数据并放在消息队列里
if ((num=ReadToQue3(sockfd,msgid,&Pbuf))0)
printf("kill the demochild stat=(%d)n",stat);
//printf("child %d termernate stat(%d)....n",pid,stat);
return;
}
signal(SIGCHLD,sig_child);
这只是对第一个僵死进程有效。
if (FD_ISSET(sockfd,&allset))
{
printf("========= sock=%d can read ====================n",sockfd);
idealtime[i]=firsttm;
if ((child=fork())==0)//////////getppid()获得父进程的ID
{
close(listenfd);
//msgid 为消息队列的描述符Pbuf为一个结构,该函数实现从sockfd读数据并放在消息队列里
if ((num=ReadToQue3(sockfd,msgid,&Pbuf))0)
printf("kill the demochild stat=(%d)n",stat);
//printf("child %d termernate stat(%d)....n",pid,stat);
return;
}
signal(SIGCHLD,sig_child);
这只是对第一个僵死进程有效。
|
1.僵尸进程问题:你应该在父进程中对SIGCLD信号做处理,一般如果你是sco5.x的话,只要调用signal(SIGCLD, SIG_IGN)就可以了!如果按你的程序写,应该在sig_child()的最后加入signal(SIGCLD, sig_child)试试!
2.关于read()的问题:一般socket可读时有两总情况,如果你是阻塞socket,read接受到对方的FIN或者数据才会返回,如果是非阻塞的则没有数据时立刻返回,你可以根据返回的值来判断
2.关于read()的问题:一般socket可读时有两总情况,如果你是阻塞socket,read接受到对方的FIN或者数据才会返回,如果是非阻塞的则没有数据时立刻返回,你可以根据返回的值来判断
|
楼上说得没错,signal函数你只注册了一次,收到一个子进程的终止信号后就失效了。
read()函数写的不够好,如果设为非阻塞需要对一些状态进行处理,给你个
参考看看
int ReadData(int fd, void *bufPtr, int dataLength)
{
int leftLen, readLen;
char *tempPtr;
leftLen = dataLength;
tempPtr = bufPtr;
while(leftLen > 0){
if((readLen = read(fd, tempPtr, leftLen))
read()函数写的不够好,如果设为非阻塞需要对一些状态进行处理,给你个
参考看看
int ReadData(int fd, void *bufPtr, int dataLength)
{
int leftLen, readLen;
char *tempPtr;
leftLen = dataLength;
tempPtr = bufPtr;
while(leftLen > 0){
if((readLen = read(fd, tempPtr, leftLen))