Segmentation fault错误

shuchuanyu 2009-07-23 09:25:46

#include <stdio.h>
#include <sys/types.h>
#include <sys/fcntl.h>
#include <dirent.h>
#include <sys/stat.h>
#include <string.h>

int main()
{
struct DIR *dp;
struct dirent *temp_dp;
char temp_name[NAME_MAX+1];
struct stat temp_stat;
int temp_fd;

dp=opendir("/dev/");
if(dp==NULL){
fprintf(stderr,"open /dev/ dir error");
exit(0);
}
strcpy(temp_name,"/dev/");

while((temp_dp=readdir(dp))!=NULL){
strncpy(temp_name+sizeof("/dev/")-1,
temp_dp->d_name,NAME_MAX);
if(strcmp(temp_name,"/dev/.")==0 || strcmp(temp_name,
"/dev/..")==0)
continue;
if((temp_fd=open(temp_name,O_RDONLY))<0){
fprintf(stderr,"open file %s error\n",temp_name);
exit(0);
}
if(stat(temp_name,&temp_stat)<0){
fprintf(stderr,"get file %s stat error\n",temp_name);
exit(0);
}

if(isastream(temp_fd)){
printf("%s is a stream device ",temp_name);

if(S_ISREG(temp_stat.st_mode)){
printf("and regular file");
}else if(S_ISDIR(temp_stat.st_mode)){
printf("and dir file");
}else if(S_ISCHR(temp_stat.st_mode)){
printf("and charact device file");
}else if(S_ISBLK(temp_stat.st_mode)){
printf("and block device file");
}else if(S_ISFIFO(temp_stat.st_mode)){
printf("and fifo file");
}
printf("\n");
}
close(temp_fd);
}
}


怎么输出Segmentation fault错误?
...全文
152 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
DarkChampion 2009-07-23
  • 打赏
  • 举报
回复
建议单步调试一下,
重点看看temp_dp=readdir(dp)执行后temp_dp的内容是否正常,尤其是temp_dp->d_name
DarkChampion 2009-07-23
  • 打赏
  • 举报
回复
NAME_MAX虽然大于了NAME_MAX-(sizeof("/dev/")-1)
但是并不一定会产生段错误,要看temp_dp->d_name的实际长度
shuchuanyu 2009-07-23
  • 打赏
  • 举报
回复
应该改成 NAME_MAX-(sizeof("/dev/")-1) 对吧?
[Quote=引用 7 楼 leeyiqun 的回复:]
引用 5 楼 shuchuanyu 的回复:
明天试下 谢谢了引用 4 楼 showman 的回复:
strncpy(temp_name[sizeof("/dev/")-1],temp_dp->d_name,strlen(temp_dp->d_name));
改成这样!

这里用strncat更好。。



这样不对了,temp_name[sizeof("/dev/")-1] 是一个字符,需要的是地址,改成这样:
strncpy(&temp_name[sizeof("/dev/")-1],temp_dp->d_name,strlen(temp_dp->d_name));
楼主原来的语句应该是对的,错误的是这个:
strncpy(temp_name+sizeof("/dev/")-1,temp_dp->d_name,NAME_MAX);
大小已经超出temp_name的范围了。
[/Quote]
leeyiqun 2009-07-23
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 shuchuanyu 的回复:]
明天试下 谢谢了引用 4 楼 showman 的回复:
strncpy(temp_name[sizeof("/dev/")-1],temp_dp->d_name,strlen(temp_dp->d_name));
改成这样!

这里用strncat更好。。

[/Quote]

这样不对了,temp_name[sizeof("/dev/")-1] 是一个字符,需要的是地址,改成这样:
strncpy(&temp_name[sizeof("/dev/")-1],temp_dp->d_name,strlen(temp_dp->d_name));
楼主原来的语句应该是对的,错误的是这个:
strncpy(temp_name+sizeof("/dev/")-1,temp_dp->d_name,NAME_MAX);
大小已经超出temp_name的范围了。
paradise099 2009-07-23
  • 打赏
  • 举报
回复
我觉得在使用strcpy之类的函数前,最好要确保数组的长度足够,而不会产生越界.
如果出现错误,最好是调试一下,把问题先定位了,问题也就自然解决了.
shuchuanyu 2009-07-23
  • 打赏
  • 举报
回复
明天试下 谢谢了[Quote=引用 4 楼 showman 的回复:]
strncpy(temp_name[sizeof("/dev/")-1],temp_dp->d_name,strlen(temp_dp->d_name));
改成这样!

这里用strncat更好。。
[/Quote]
ShowMan 2009-07-23
  • 打赏
  • 举报
回复
strncpy(temp_name[sizeof("/dev/")-1],temp_dp->d_name,strlen(temp_dp->d_name));
改成这样!

这里用strncat更好。。
shuchuanyu 2009-07-23
  • 打赏
  • 举报
回复
能说下具体什么问退么? 谢了
[Quote=引用 1 楼 dalier149 的回复:]
strncpy(temp_name+sizeof("/dev/")-1,temp_dp->d_name,NAME_MAX);
=====================================================
这句有问题
[/Quote]
DarkChampion 2009-07-23
  • 打赏
  • 举报
回复
必定是非法访存

NAME_MAX多大?
dalier149 2009-07-23
  • 打赏
  • 举报
回复
strncpy(temp_name+sizeof("/dev/")-1,temp_dp->d_name,NAME_MAX);
=====================================================
这句有问题

23,125

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧