Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 在我的服务器中,我发现创建的子进程在不执行其工作的情况下异常终止_C - Fatal编程技术网

C 在我的服务器中,我发现创建的子进程在不执行其工作的情况下异常终止

C 在我的服务器中,我发现创建的子进程在不执行其工作的情况下异常终止,c,C,此服务器可以处理两种类型的客户端—一种请求一次性数据传输,另一种请求定期数据传输。 它等待来自客户端的控制字符启动和停止传输。 对于一次性“c”启动变速箱,对于定期“a”启动和“b”停止变速箱。 但是,当执行进入“a”的条件检查时,执行在那里停止,并且子级开始接收不可预测的值,如(032767)。 当我使用gdb检查时,它也没有显示任何关于“if(control=='a')”的内容。 你能给我一些建议来解决这个问题吗 `while(1) { sin_size

此服务器可以处理两种类型的客户端—一种请求一次性数据传输,另一种请求定期数据传输。 它等待来自客户端的控制字符启动和停止传输。 对于一次性“c”启动变速箱,对于定期“a”启动和“b”停止变速箱。 但是,当执行进入“a”的条件检查时,执行在那里停止,并且子级开始接收不可预测的值,如(032767)。 当我使用gdb检查时,它也没有显示任何关于“if(control=='a')”的内容。 你能给我一些建议来解决这个问题吗

     `while(1)
    {

        sin_size = sizeof(struct sockaddr_storage);

        connected = accept(sock1, (struct sockaddr *)&client_addr,&sin_size);
         //connecteds[count]=connected;
         //clients[count]=client_addr;
         if(connected == -1){
            perror("accept");
            continue;
           }
         count++;
         printf("\n%d %d\n",count,connected);
         inet_ntop(client_addr.ss_family,get_in_addr((struct sockaddr *)&client_addr),s, sizeof s);
         printf("server: got connection from %s\n", s);

         pid=fork();
         if(pid<0)perror("error in fork");

        if(pid==0)
        {
         while(1){
                 int no;
                 char control;
                 printf("\n waiting for data request from clients:.......\n");
                 fflush(stdout);
                 bzero(&control,1);
                 while(1){
                          bytes_recieved = recv(connected,&control,1,0);
                          if(control=='a'||control=='b'||control=='c')
                          break;
                         }
                          r1.control1=control;
                          r1.client=client_addr;
                          send(sock,&r1,sizeof(struct recieved),0);
                 printf("\nreceived data request is :%c from client (%s)\n", control,s);
                 fflush(stdout);
                 if(control=='a')
                   {printf("..................");
                    struct argument *argu;
                    argu->dis=connected;
                                         argu->sock=sock;
                    argu->cli=client_addr;

                   //inet_ntop(client_addr.ss_family,get_in_addr((struct sockaddr *)&client),s, sizeof s);
                    printf("transmission started for client:%s\n",s);
                    fflush(stdout);

                    pthread_create(&tid1,NULL,sends,(void*)argu);
                    pthread_create(&tid2,NULL,recieve,(void*)argu);

                    pthread_join(tid1,NULL);
                    pthread_join(tid2,NULL);

                    control=value;
                    printf("comming here\n");
                    fflush(stdout);
                   }
                 if(control=='b')
                   {
                    printf("terminating the connection with client (%s).\n",s);
                    fflush(stdout);
                    break;
                   }
                 if(control=='c')
                   {
                    while(1){
                             recv(sock,&data1,sizeof(struct dataset),0);
                             if(data1.data==200)
                             break;
                            }

                    send(connected,&data1,sizeof(struct dataset),0);

                    printf("getting data from server %c\n%d\nterminating the connection with client (%s).\n",data1.a,data1.data,s);
                    fflush(stdout);
                    break;
                   }
                }//end of while2
        }//end of child
`while(1)
{
sin_size=sizeof(结构sockaddr_存储);
connected=accept(sock1,(结构sockaddr*)和client\u addr,以及sin\u size);
//connecteds[计数]=已连接;
//客户[计数]=客户地址;
如果(已连接==-1){
佩罗(“接受”);
继续;
}
计数++;
printf(“\n%d%d\n”,计数,已连接);
inet\u ntop(客户机地址、ss系列、get\u地址((结构sockaddr*)和客户机地址)、s、s的大小;
printf(“服务器:已从%s获得连接\n”,s);
pid=fork();
如果(piddis=已连接;
argu->sock=sock;
argu->cli=client\u addr;
//inet_ntop(客户机地址ss_系列,get_in_地址((struct sockaddr*)和客户机),s,sizeof s);
printf(“已为客户端%s\n”,s)启动传输);
fflush(stdout);
pthread_创建(&tid1,NULL,sends,(void*)argu);
pthread_创建(&tid2,NULL,receive,(void*)argu);
pthread_join(tid1,NULL);
pthread_join(tid2,NULL);
控制=值;
printf(“在此提交”\n);
fflush(stdout);
}
如果(控制=='b')
{
printf(“正在终止与客户端(%s)的连接。\n”,s);
fflush(stdout);
打破
}
如果(控制=='c')
{
而(1){
recv(sock和data1,sizeof(struct-dataset),0);
如果(data1.data==200)
打破
}
发送(已连接,&data1,sizeof(struct-dataset),0);
printf(“从服务器%c获取数据\n%d\n终止与客户端(%s)的连接)。\n”、data1.a、data1.data、s);
fflush(stdout);
打破
}
}//结束时2
}//孩子的末日

`

您不为
argu
指针分配内存

struct argument *argu = malloc(sizeof(struct argument));
记住
释放
pthread\u join
的两次调用后的指针

编辑 更好的是,不要使用指针,只需使用以下结构:

struct argument argu;

argu.dis = connected;
/* etc. */

pthread_create(&tid1,NULL,sends,&argu);
pthread_create(&tid2,NULL,recieve,&argu);

谢谢兄弟,我愚蠢地考虑了大问题&忽略了基本问题。