首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • fscanf()是否会陷入死循环?CPU占用率剧增? [已结贴,结贴人:wanlifeifei]
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • wanlifeifei
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 揭贴率:
    发表于:2008-08-21 17:59:40 楼主
    int loadFileToArray(const char * filename,CHARUSER * localSeatID)
    {
        CHARUSER sID;
    int user_count;

    ProcessEventLog(TRC_WRN,ERR_TRC,Info(0),"Entered loadFileToArray\n");

        user_count = 0;
        while ( user_count < maxSeatID )
        {
    ProcessEventLog(TRC_WRN,ERR_TRC,Info(0),"user_count = [%d]",user_count);
    if (feof(SeatIDstream))
    {
    ProcessEventLog(TRC_WRN,ERR_TRC,Info(0),"Error in feof(stream)\n");
    return -1;
    }
    ProcessEventLog(TRC_WRN,ERR_TRC,Info(0),"feof(SeatIDstream) = [%d]",feof(SeatIDstream));

            fscanf(SeatIDstream,"%s \n", sID);

    ProcessEventLog(TRC_WRN,ERR_TRC,Info(0),"fscanf");
            strncpy(localSeatID[user_count],sID,sizeof(sID));
    ProcessEventLog(TRC_WRN,ERR_TRC,Info(0),"strncpy");
            ProcessEventLog(TRC_DBG,ERR_TRC,Info(0),"->[%s]\n", localSeatID[user_count]);
    user_count++;
        }
        ProcessEventLog(TRC_DBG,ERR_TRC,Info(0),"Number of Records %d", (user_count));
    return 0;
    }

    这样一个函数,给定文件,循环读取固定数量(maxSeatID )的数据。
    被读取的文件共包含100条数据,如果没有读取到规定数量(maxSeatID )的数据,则返回-1,主函数将关闭SeatIDstream,并重新打开SeatIDstream,从头开始读取。
    ProcessEventLog是打印日志的函数。

    问题在于这里,如果固定数量SeatIDstream取1~58时,程序可以正常运行,反复读取n次。
    但SeatIDstream取59或者更大时,程序就会卡住,并且CPU占用率剧增。
    我打印日至下来就卡在fscanf()这里,百思不得其解。
    就是在第二次读取时卡在fscanf第1条数据的时候,为什么呢?
    并没有其他函数或者线程使用这个文件。

    为什么呢?fscanf在什么情况下会处于死循环状态,并占用cpu呢?


    100  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • wanlifeifei
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-21 18:01:421楼 得分:0
    C/C++ code
    int loadFileToArray(const char * filename,CHARUSER * localSeatID) { CHARUSER sID; int user_count; ProcessEventLog(TRC_WRN,ERR_TRC,Info(0),"Entered loadFileToArray\n"); user_count = 0; while ( user_count < maxSeatID ) { ProcessEventLog(TRC_WRN,ERR_TRC,Info(0),"user_count = [%d]",user_count); if (feof(SeatIDstream)) { ProcessEventLog(TRC_WRN,ERR_TRC,Info(0),"Error in feof(stream)\n"); return -1; } ProcessEventLog(TRC_WRN,ERR_TRC,Info(0),"feof(SeatIDstream) = [%d]",feof(SeatIDstream)); fscanf(SeatIDstream,"%s \n", sID); ProcessEventLog(TRC_WRN,ERR_TRC,Info(0),"fscanf"); strncpy(localSeatID[user_count],sID,sizeof(sID)); ProcessEventLog(TRC_WRN,ERR_TRC,Info(0),"strncpy"); ProcessEventLog(TRC_DBG,ERR_TRC,Info(0),"->[%s]\n", localSeatID[user_count]); user_count++; } ProcessEventLog(TRC_DBG,ERR_TRC,Info(0),"Number of Records %d", (user_count)); return 0; }
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • wanlifeifei
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-22 09:17:002楼 得分:0
    我顶!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • ChamPagneZ
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-22 09:33:183楼 得分:10
    C/C++ code
    fscanf(SeatIDstream,"%s \n", sID);// fscanf(SeatIDstream,"%s", sID);

    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • hqin6
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-22 09:46:034楼 得分:10
    引用 3 楼 ChamPagneZ 的回复:
    C/C++ code 
    fscanf(SeatIDstream,"%s \n", sID);//  fscanf(SeatIDstream,"%s", sID);


    试了没?好使不?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • ChamPagneZ
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-22 09:48:055楼 得分:10
    引用 4 楼 hqin6 的回复:
    引用 3 楼 ChamPagneZ 的回复:
    C/C++ code
    fscanf(SeatIDstream,"%s \n", sID);//  fscanf(SeatIDstream,"%s", sID);


    试了没?好使不?

    没试,瞎猜.
    楼主的代码封装起来了,咋试啊?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • hqin6
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-22 10:01:126楼 得分:10
    单就fscanf没看出什么问题来,

      strncpy(localSeatID[user_count],sID,sizeof(sID));
    这句话倒是可能出问题~
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • k2eats
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-22 10:08:537楼 得分:10
    fscanf(SeatIDstream,"%s \n", sID);
    你的scanf加了\n 但是文件格式和它一样吗?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • e_sharp
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-22 10:22:578楼 得分:10
    UP
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • elovenana
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-22 13:19:009楼 得分:10
    int loadFileToArray(const char * filename,CHARUSER * localSeatID)
    没有看到你打开文件呀?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • jillnicky
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-22 13:32:5710楼 得分:10
    引用 6 楼 hqin6 的回复:
    单就fscanf没看出什么问题来,

      strncpy(localSeatID[user_count],sID,sizeof(sID));
    这句话倒是可能出问题~

    up
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • xqls_xqls
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-22 13:46:1111楼 得分:10
    学习
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • wanlifeifei
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-22 14:39:2012楼 得分:0
    fscanf(SeatIDstream,"%s", sID);
    我尝试了一下,不行~~一样卡在这里。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • wanlifeifei
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-22 14:43:1913楼 得分:0
    我后来查了一下,绝对是
    C/C++ code
    fscanf(SeatIDstream,"%s \n", sID);
    的问题,因为将他放在loadFileToArray函数以外的地方一样会卡住。
    我追下来,是卡在一个CreateConnections函数之后,可是这个函数是做socket连接的,不明白怎么会出问题,以下是该函数的代码:
    C/C++ code
    int CreateConnections(int noOfConn,int portNo) { int i; int servSock; /* Socket descriptor for server */ int clntSock; /* Socket descriptor for client */ struct sockaddr_in echoServAddr; /* Local address */ struct sockaddr_in echoClntAddr; /* Client address */ unsigned short echoServPort; /* Server port */ unsigned int clntLen; /* Length of client address data structure */ echoServPort = portNo; /* Create socket for incoming connections */ if ((servSock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) { DieWithError("socket() failed"); } ProcessEventLog(TRC_WRN,ERR_TRC,Info(0),"ServSock = [%d]\n",servSock); /* Construct local address structure */ memset(&echoServAddr, 0, sizeof(echoServAddr)); /* Zero out structure */ echoServAddr.sin_family = AF_INET; /* Internet address family */ echoServAddr.sin_addr.s_addr = htonl(INADDR_ANY); /* Any incoming interface */ echoServAddr.sin_port = htons(echoServPort); /* Local port */ /* Bind to the local address */ if (bind(servSock, (struct sockaddr *) &echoServAddr, sizeof(echoServAddr)) < 0) { DieWithError("bind() failed"); } /* Mark the socket so it will listen for incoming connections */ if (listen(servSock, MAXPENDING) < 0) { DieWithError("listen() failed"); } /* Run forever */ i = 0; int inj_i = 1; for (;;) { /* Set the size of the in-out parameter */ clntLen = sizeof(echoClntAddr); /* Wait for a client to connect */ if ((clntSock = accept(servSock, (struct sockaddr *) &echoClntAddr, &clntLen)) < 0) DieWithError("accept() failed"); /* clntSock is connected to a client! */ ProcessEventLog(TRC_DBG,ERR_TRC,Info(0),"Handling client %s\n", inet_ntoa(echoClntAddr.sin_addr)); npipeID[i] = clntSock; i++; if(i == noOfProcesses) { break; } } ProcessEventLog(TRC_WRN,ERR_TRC,Info(0),"End in CreateConnections.....\n"); return servSock; }


    应该跟那个没有关系阿,但是就是会卡在fscanf这里,而且移动两者在main中所处的位置,关系都是一样的,只要fscanf出现在CreateConnections之后,就会陷入死循环
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • hqin6
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-22 14:49:5514楼 得分:10
    break前,先close掉你的socket
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • wanlifeifei
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-22 16:07:1515楼 得分:0
    引用 14 楼 hqin6 的回复:
    break前,先close掉你的socket

    恩~~我在break前已经close掉我的socket了
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • wanlifeifei
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-22 16:11:2216楼 得分:0
    问题解决了,不好意思浪费大家时间了,我在这里解释一下。

    问题代码段在于保存socket ID的npipeID[i],这是一个指针。

    在循环前给这个指针分配了空间:
    C/C++ code
    npipeID = (int *)malloc(sizeof(int)*noOfProcesses); memset(npipeID,NULL,sizeof(int)*noOfProcesses);


    这是在循环体外的,并且没有释放,我将这两句话放在循环体的最顶端,也就是loadFileToArray函数前。
    然后再break前使用free(npipeID),然后问题就解决了。

    可是具体为什么呢?我也不明白,我觉得只有内存泄漏可以解释了,可是npipeID我一直都在反复利用,而且每次使用的大小都是一样的。不明白为什么会产生这种问题。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • hqin6
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    发表于:2008-08-22 16:18:2117楼 得分:0
    引用 16 楼 wanlifeifei 的回复:
    问题解决了,不好意思浪费大家时间了,我在这里解释一下。

    问题代码段在于保存socket ID的npipeID[i],这是一个指针。

    在循环前给这个指针分配了空间:

    C/C++ code
    npipeID = (int *)malloc(sizeof(int)*noOfProcesses);
    memset(npipeID,NULL,sizeof(int)*noOfProcesses);


    这是在循环体外的,并且没有释放,我将这两句话放在循环体的最顶端,也就是loadFileToArray函数前。
    然后再break前使用free(npipeI…


    汗~~看明白你的意思了~
    修改 删除 举报 引用 回复

    网站简介广告服务网站地图帮助联系方式诚聘英才English 问题报告
    北京创新乐知广告有限公司 版权所有 京 ICP 证 070598 号
    世纪乐知(北京)网络技术有限公司 提供技术支持
    Copyright © 2000-2008, CSDN.NET, All Rights Reserved