- 论坛徽章:
- 0
|
自己照一本书上做的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;
} |
|