免费注册 查看新帖 |

Chinaunix

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

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

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

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

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

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

论坛徽章:
0
2 [报告]
发表于 2007-07-11 22:55 |只看该作者
这是开始和停止的回调函数代码,我不知道怎么贴代码格式,不知哪位愿意教给我……

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
3 [报告]
发表于 2007-07-12 00:33 |只看该作者
我已经改成了带wait的:

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;
                waitpid(-1,NULL,WNOHANG);
        }
        g_printf("Server start. Now pidrecord = %d\n",pidrecord);
        gtk_label_set_text(GTK_LABEL(label),"Start");
}


但是依然会有这个问题,就是如果我只是反复的开始->停止,不访问任何页面,那么shs进程的状态是正常的,但是如果我访问了服务器上的页面,然后停止,之后再开始的shs,直接就是defunct……
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP