免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2315 | 回复: 9

[Linux] getpwuid()出错 [复制链接]

论坛徽章:
2
申猴
日期:2014-07-17 10:05:182015年迎新春徽章
日期:2015-03-04 09:58:11
发表于 2013-03-23 20:55 |显示全部楼层
问题链接到 csdn
http://bbs.csdn.net/topics/390402038
好像没什么人看,来这里碰碰运气

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
发表于 2013-03-27 22:51 |显示全部楼层
回复 1# Zhc1993


    贴代码。

论坛徽章:
2
申猴
日期:2014-07-17 10:05:182015年迎新春徽章
日期:2015-03-04 09:58:11
发表于 2013-03-28 10:56 |显示全部楼层
本帖最后由 Zhc1993 于 2013-03-28 19:06 编辑
  1. /*set the local files'value*/
  2. /*set the local files'value*/
  3. gboolean get_file_info_stat(const char *file_name,struct stat *s_buff, File *local_file)
  4. {
  5.         char date[20];
  6.         char mode[11] ="----------";
  7.         if(s_buff == NULL || local_file == NULL)
  8.         {
  9.                 printf("s_buff or local_file is NULL pointer:%s\n",file_name);
  10.                 return FALSE;
  11.         }

  12.         mode_t file_mode = s_buff->st_mode;
  13.         struct passwd *passwd_info = getpwuid(s_buff->st_uid);
  14.         if(passwd_info == NULL)
  15.         {
  16.                 perror("getpwuid:\n");
  17.                 printf("%s\n",file_name);
  18.                 return TRUE;
  19.         }
  20.         if(passwd_info != NULL)
  21.         {
  22.                 struct group *group_info = getgrgid(s_buff->st_gid);
  23.                 if(group_info == NULL)
  24.                 {
  25.                         printf("getgrgid error:%s\n",file_name);
  26.                 }
  27.                 if(group_info != NULL)
  28.                 {
  29.                         /*file types*/
  30.                         if(S_ISDIR(file_mode))
  31.                                 mode[0] = 'd';
  32.                         else if(S_ISREG(file_mode))
  33.                                 mode[0] = 'r';
  34.                         else if(S_ISCHR(file_mode))
  35.                                 mode[0] = 'c';
  36.                         else if(S_ISBLK(file_mode))
  37.                                 mode[0] = 'b';
  38.                         else if(S_ISFIFO(file_mode))
  39.                                 mode[0] = 'p';
  40.                         else if(S_ISLNK(file_mode))
  41.                                 mode[0] = 'l';
  42.                         else if(S_ISSOCK(file_mode))
  43.                                 mode[0] = 's';
  44.                         else
  45.                         {
  46.                                 printf("file mode error:%s\n",file_name);
  47.                                 return FALSE;
  48.                         }

  49.                        
  50.                         /*file state*/
  51.                         mode[1] = (file_mode & S_IRUSR) ? 'r' : '-';
  52.                         mode[2] = (file_mode & S_IWUSR) ? 'w' : '-';
  53.                         mode[3] = (file_mode & S_IXUSR) ? 'x' : '-';
  54.                         mode[4] = (file_mode & S_IRGRP) ? 'r' : '-';
  55.                         mode[5] = (file_mode & S_IWGRP) ? 'w' : '-';
  56.                         mode[6] = (file_mode & S_IXGRP) ? 'x' : '-';
  57.                         mode[7] = (file_mode & S_IROTH) ? 'r' : '-';
  58.                         mode[8] = (file_mode & S_IWOTH) ? 'w' : '-';
  59.                         mode[9] = (file_mode & S_IXOTH) ? 'x' : '-';
  60.                        
  61.                         strftime(date,13,"%b %d %H:%M",localtime(&(s_buff->st_mtime)));

  62.                         /*give the value to local_file pointer*/
  63.                         strcpy(local_file->file_name,file_name);
  64.                         local_file->file_size = (gint)s_buff->st_size;
  65.                         strcpy(local_file->own_name,passwd_info->pw_name);
  66.                         strcpy(local_file->group_name,group_info->gr_name);
  67.                         strcpy(local_file->date,date);
  68.                         strcpy(local_file->file_state,mode);
  69.                         return TRUE;

  70.                 }
  71.                        
  72.         }
  73.         return FALSE;
  74. }
  75.                                                    
复制代码

论坛徽章:
0
发表于 2013-03-28 17:51 |显示全部楼层
回复 3# Zhc1993

楼主,代码里加多余的行号干嘛?!
   

论坛徽章:
2
申猴
日期:2014-07-17 10:05:182015年迎新春徽章
日期:2015-03-04 09:58:11
发表于 2013-03-28 19:04 |显示全部楼层
没怎么用过ChinaUnix 上传代码的功能,没想到自带行号,源程序里也有行号忘了消了

论坛徽章:
2
申猴
日期:2014-07-17 10:05:182015年迎新春徽章
日期:2015-03-04 09:58:11
发表于 2013-03-28 19:07 |显示全部楼层
这下好了
)

论坛徽章:
0
发表于 2013-03-28 22:40 |显示全部楼层
本帖最后由 txgc_wm 于 2013-03-29 00:26 编辑
  1. ERRORS
  2.        0 or ENOENT or ESRCH or EBADF or EPERM or ...
  3.               The given name or uid was not found.

  4.        EINTR  A signal was caught.

  5.        EIO    I/O error.

  6.        EMFILE The maximum number (OPEN_MAX) of files was open already in the calling process.

  7.        ENFILE The maximum number of files was open already in the system.

  8.        ENOMEM Insufficient memory to allocate passwd structure.

  9.        ERANGE Insufficient buffer space supplied.
复制代码
建议楼主执行以下操作:
1.利用所写的get_file_info_stat的api接口,编写测试只针对提到的两个错误文件;
2.将getpwuid()错误信息打印出来,看是以上信息的哪一类。

在文件数目较少的目录下作测试,现象正常?或则是在文件较多的目录下,测试现象也正常?还是单独提到的那个目录有问题?是否存在资源没有释放,引发问题?

论坛徽章:
2
午马
日期:2015-01-27 11:22:392015年辞旧岁徽章
日期:2015-03-03 16:54:15
发表于 2013-03-28 23:17 |显示全部楼层
问题在于
无论你调用getpwuid/getgrgid 并检查errno

需要注明的时每次调用之前先将errno 清零。

另外代码真的很难看。

论坛徽章:
2
申猴
日期:2014-07-17 10:05:182015年迎新春徽章
日期:2015-03-04 09:58:11
发表于 2013-03-29 10:58 |显示全部楼层
回复 8# to407
代码难看,有什么好的建议 谢谢



   

论坛徽章:
2
午马
日期:2015-01-27 11:22:392015年辞旧岁徽章
日期:2015-03-03 16:54:15
发表于 2013-03-29 17:52 |显示全部楼层
回复 9# Zhc1993


    没。。。看了连续N行一律式的代码。。。就困了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP