免费注册 查看新帖 |

Chinaunix

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

[学习分享] 读取Linux进程配置信息的出现了程序死机问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2017-02-18 20:26 |只看该作者 |倒序浏览
本帖最后由 清楚山下 于 2017-02-18 20:34 编辑
  1. <blockquote>#include<dirent.h>
复制代码
在写关于嵌入式设备远程升级的程序,首先想获取设备内进程的配置信息,但是程序编译出了问题,Segmentation fault (core dumped),我是菜鸟,不知道怎么处理,求各位指导
  1. #include<dirent.h>

  2. #include<stdio.h>

  3. #include<string.h>



  4. #define SE_SUCCESS  0

  5. #define SE_ERROR   -1

  6. #define CLRF "\r\n"



  7. #define MAXLEN 10240    //读取的文件最大字节数



  8. unsigned char  g_NewVersion[10];       //版本号



  9. static char  read_config(char * pParam, char * pValue, char * pFileName);

  10. static char* ReadVersion(char *dest);


  11. int main(int argc, char **argv[])
  12. {
  13.    char *buf;
  14.    ReadVersion(buf);


  15. }





  16. //寻找进程所属文件位置,并输出版本号

  17. char* ReadVersion(char *dest)

  18. {

  19.     DIR *dir;

  20.         int i=0;

  21.         int pos=0;

  22.     struct dirent *ptr;

  23.     FILE *fp;

  24.     char filepath[50];//大小随意,能装下cmdline文件的路径即可

  25.     char filetext[50];//大小随意,能装下要识别的命令行文本即可

  26.         char version[10]; //进程的版本号

  27.         char *pVersion;

  28.         char *ProcessName;

  29.         char *s;

  30.     dir = opendir("/proc"); //打开系统所有进程ID所在路径
  31.   //  printf("%s",dir->d_name);

  32.     if (NULL != dir)

  33.     {

  34.         while ((ptr = readdir(dir)) != NULL) //循环读取路径下的每一个文件/文件夹

  35.         {

  36.                 //        i++;
  37.          //   printf("%s \n",ptr->d_name);

  38.             //如果读取到的是"."或者".."则跳过,读取到的不是文件夹名字也跳过

  39.             if ((strcmp(ptr->d_name, ".") == 0) || (strcmp(ptr->d_name, "..") == 0)) continue;

  40.        //     if (DT_DIR != ptr->d_type) continue;

  41.               if(!isdigit(ptr->d_name)) continue;

  42.             sprintf(filepath, "/proc/%s/status", ptr->d_name);//生成要读取的版本配置文件的路径
  43.              printf("%s \n",filepath);

  44.   //          fp = fopen(filepath, "r");//打开文件

  45.                         i++;

  46.                 //        Version = read_version(("CUR_VERSION", pVersion, g_tInfo.VerName ));   //读取版本文件

  47.                         if ( read_config("Process_VERSION", pVersion, filepath) == -1 )          //返回的是版本号

  48.                               {

  49.                                     printf("read Process_VERSION error \n");

  50.                                 //    return -1;

  51.                               }

  52.                         else  {

  53.                                      strcpy(version, pVersion);

  54.                                  //   version = read_config("Process_VERSION", pVersion, filepath);

  55.                         //                return  version;

  56.                               }

  57.                                   

  58.                         if ( read_config("Name", pVersion, filepath) == -1)

  59.                         {

  60.                              printf("read Name error \n");

  61.                                 //  return -1;

  62.                         }

  63.                         else  {

  64.                                     strcpy(ProcessName, pVersion);

  65.                         //                ProcessName = read_config("Name", pVersion, filepath);

  66.                         //                return  version;

  67.                               }       

  68.                         sprintf(s, "%s%s",ProcessName,version);       

  69.                 //        strcpy(temp,s);

  70.         //                dest[pos++] = s;

  71.                         return dest;          

  72.                        

  73. /*          if (NULL != fp)

  74.             {

  75.                 fread(filetext, 1, 50, fp);//读取文件

  76.                 filetext[49] = '\0';//给读出的内容加上字符串结束符

  77.                 //如果文件内容满足要求则打印路径的名字(即进程的PID)

  78.                 if (filetext == strstr(filetext, "status.ini"))     //若读取内容是版本文件

  79.                                        

  80.                                        

  81.                                         printf("PID:  %s\n", ptr->d_name);

  82. */                                       

  83. //                fclose(fp);

  84. //           }

  85.            

  86.         }

  87.         closedir(dir);//关闭路径

  88.     }

  89. }





  90. //读取文件

  91. char read_config(char * pParam,

  92.                                 char * pValue,

  93.                                 char * pFileName)

  94. {

  95.         FILE *fp;

  96.         int accLen=0,bytes_read;       

  97.         char buffer[10240]="\0";       

  98.         char tmpValue[128]="\0";

  99.         char* match;       



  100.         fp = fopen(pFileName,"r");       

  101.         if (fp <= 0)

  102.         {                

  103.                 printf("%s\n","Read config File Fail......");

  104.                 return SE_ERROR;

  105.         }                 



  106.         bytes_read = fread(buffer, 1, sizeof(buffer),fp);        

  107.        

  108.         fclose(fp);

  109.        

  110.         if (bytes_read == 0 || bytes_read == sizeof(buffer))    //可能存在问题

  111.         {       

  112.                 return SE_ERROR;

  113.         }       



  114.         buffer[bytes_read] = '\0';        

  115.        

  116.         match =(char *) strstr(buffer, pParam);

  117.         if (match == NULL)

  118.         {               

  119.                 return SE_ERROR;

  120.         }

  121.        

  122.         match =(char *) strchr(match, ':');

  123.        

  124.         if (match == NULL)

  125.         {               

  126.                 return SE_ERROR;

  127.         }

  128.                         

  129.         accLen = strcspn(match+1,CLRF);

  130.         if(accLen>0)

  131.         {

  132.                 strncpy(tmpValue,match+1,accLen);

  133.                 strcpy(pValue, tmpValue);

  134.         //        return  accLen;

  135.         }               

  136.         return SE_SUCCESS;

  137.   
  138. }
复制代码

论坛徽章:
72
20周年集字徽章-20	
日期:2020-10-28 14:04:30操作系统版块每日发帖之星
日期:2016-07-13 06:20:0015-16赛季CBA联赛之广夏
日期:2016-07-10 09:04:02数据库技术版块每日发帖之星
日期:2016-07-09 06:20:00操作系统版块每日发帖之星
日期:2016-07-09 06:20:00数据库技术版块每日发帖之星
日期:2016-07-07 06:20:00操作系统版块每日发帖之星
日期:2016-07-07 06:20:00操作系统版块每日发帖之星
日期:2016-07-04 06:20:00数据库技术版块每日发帖之星
日期:2016-07-03 06:20:00操作系统版块每日发帖之星
日期:2016-07-03 06:20:00数据库技术版块每日发帖之星
日期:2016-07-02 06:20:00操作系统版块每日发帖之星
日期:2016-07-02 06:20:00
2 [报告]
发表于 2017-02-20 12:50 |只看该作者
用GDB调试一下看看

论坛徽章:
72
20周年集字徽章-20	
日期:2020-10-28 14:04:30操作系统版块每日发帖之星
日期:2016-07-13 06:20:0015-16赛季CBA联赛之广夏
日期:2016-07-10 09:04:02数据库技术版块每日发帖之星
日期:2016-07-09 06:20:00操作系统版块每日发帖之星
日期:2016-07-09 06:20:00数据库技术版块每日发帖之星
日期:2016-07-07 06:20:00操作系统版块每日发帖之星
日期:2016-07-07 06:20:00操作系统版块每日发帖之星
日期:2016-07-04 06:20:00数据库技术版块每日发帖之星
日期:2016-07-03 06:20:00操作系统版块每日发帖之星
日期:2016-07-03 06:20:00数据库技术版块每日发帖之星
日期:2016-07-02 06:20:00操作系统版块每日发帖之星
日期:2016-07-02 06:20:00
3 [报告]
发表于 2017-02-20 12:50 |只看该作者
或者设置一下core文件的size,用gdb调试一下core文件能很快定位问题

论坛徽章:
72
20周年集字徽章-20	
日期:2020-10-28 14:04:30操作系统版块每日发帖之星
日期:2016-07-13 06:20:0015-16赛季CBA联赛之广夏
日期:2016-07-10 09:04:02数据库技术版块每日发帖之星
日期:2016-07-09 06:20:00操作系统版块每日发帖之星
日期:2016-07-09 06:20:00数据库技术版块每日发帖之星
日期:2016-07-07 06:20:00操作系统版块每日发帖之星
日期:2016-07-07 06:20:00操作系统版块每日发帖之星
日期:2016-07-04 06:20:00数据库技术版块每日发帖之星
日期:2016-07-03 06:20:00操作系统版块每日发帖之星
日期:2016-07-03 06:20:00数据库技术版块每日发帖之星
日期:2016-07-02 06:20:00操作系统版块每日发帖之星
日期:2016-07-02 06:20:00
4 [报告]
发表于 2017-02-20 12:52 |只看该作者
对了,你这个问题去C/C++板块发帖比较好,回复的应该会很多

论坛徽章:
0
5 [报告]
发表于 2017-02-22 16:54 来自手机 |只看该作者
123456%12+33&56  学习了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP