免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3755 | 回复: 7
打印 上一主题 下一主题

请教,为什么我用fork产生的进程直接就是defunct? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-07-11 23:33 |只看该作者 |倒序浏览
自己照一本书上做的Web服务器,然后用Gtk做的界面,其中有开始按钮和停止按钮。

开始按钮的回调函数直接用fork产生子进程,然后在子进程内exec执行提前编译好的服务器程序shs。

停止按钮直接system()调用kill。这个时候shs没有退出,而是变成defunct,直到图形界面退出的时候才会彻底退出。

我发现,只要我在开始之后不浏览服务器上的页面,那么反复执行开始->停止->开始->停止,开始按钮产生的shs都没有问题。但是如果我在某一次开始时浏览了服务器的页面,之后任何一次点开始之后,产生的shs直接就是defunct,为什么会这样?

这是开始和停止的回调函数代码,我不知道怎么贴代码格式,不知哪位愿意教给我……

void server_start(GtkWidget *widget, GdkEvent *event,gpointer data)
{
        if((newpid = fork()) == -1)
                perror("fork");
        else if (newpid == 0)
        {
                execvp("./shs",NULL);
        }
        else pidrecord = newpid;
        g_printf("Server start. Now pidrecord = %d\n",pidrecord);
        gtk_label_set_text(GTK_LABEL(label),"Start");
}

void server_stop(GtkWidget *widget, GdkEvent *event, gpointer data)
{
        char *kt;
        kt = malloc(sizeof(char)*20);
        printf("See 1\n");
        int i = 0;
        printf("See 2\n");
        char tempchar[10] = {'0','0','0','0','0','0','0','0','0','0'};
        printf("See 3\n");
        strcpy(kt,"kill");
        printf("Record PID : %d\n",pidrecord);
        while(pidrecord != 0)
        {
                tempchar[9-i-1] = pidrecord % 10+48;
                pidrecord /= 10;
                i++;
        }
        tempchar[9] = 0x00;

        strcat(kt," ");
        strcat(kt,tempchar);
        printf("Ready to run: %s\n",kt);      
        system(kt);
        free(kt);
        g_printf("Server Stop\n");
        gtk_label_set_text(GTK_LABEL(label),"Stop");
        return;
}

论坛徽章:
0
2 [报告]
发表于 2007-07-12 11:18 |只看该作者
查看僵尸进程产生原因
解决:
signal--SIGCHLD
waitpid

论坛徽章:
0
3 [报告]
发表于 2007-07-12 12:17 |只看该作者
谢谢,我已经加上了waitpid

现在我发现问题在于,浏览过页面之后,停止,然后再重新开始,建立socket会失败。基于TCP的socket在被释放之后,需要等待一段时间才可以在同一地址的同一端口重新建立吗?

如果需要立刻重新建立,除了close掉socket,还需要做什么?

[ 本帖最后由 neilchi 于 2007-7-12 12:18 编辑 ]

论坛徽章:
0
4 [报告]
发表于 2007-07-12 12:51 |只看该作者
原帖由 neilchi 于 2007-7-12 12:17 发表
谢谢,我已经加上了waitpid

现在我发现问题在于,浏览过页面之后,停止,然后再重新开始,建立socket会失败。基于TCP的socket在被释放之后,需要等待一段时间才可以在同一地址的同一端口重新建立吗?

如果 ...


用 setsockopt(), 搭配傳入 SO_REUSEADDR 即可..

ex:
  1. setsockopt (n, SOL_SOCKET, SO_REUSEADDR, (char *) &val, sizeof (val));
复制代码


--

论坛徽章:
0
5 [报告]
发表于 2007-07-12 16:59 |只看该作者
谢谢,我试了但是好像不行啊……关闭之后依然要等待很久才可以重新建立

论坛徽章:
0
6 [报告]
发表于 2007-07-13 09:00 |只看该作者
原帖由 neilchi 于 2007-7-12 16:59 发表
谢谢,我试了但是好像不行啊……关闭之后依然要等待很久才可以重新建立


你完整 source code 貼來看看, or 你的 socket() 建立與 setsockopt() 呼叫片段用到的敘述與變量都要貼出來
--

论坛徽章:
0
7 [报告]
发表于 2007-07-13 11:01 |只看该作者
不知道你的TCP连接是怎么做的,TCP 断连有个TIME_OUT 状态,在这段时段内端口是被系统占用着的,再用就会失败

论坛徽章:
0
8 [报告]
发表于 2007-07-15 10:19 |只看该作者
这个和僵进程有关系么? 你只要正常的关闭了套接字,那个端口和地址是可以再次使用的..
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP