当前时区为 UTC + 8 小时



发表新帖 回复这个主题  [ 9 篇帖子 ] 
作者 内容
1 楼 
 文章标题 : 运行报错:段错误,核心已转储,求帮忙!!!
帖子发表于 : 2013-03-16 18:47 

注册: 2013-03-03 10:45
帖子: 37
系统: ubuntu
送出感谢: 8
接收感谢: 0 次
自己写了一个简单的shell程序,但是运行报错:段错误,核心已转储
[C]
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <stdlib.h>
#include <string.h>
#include <signal.h>
#include <sys/wait.h>
//#define prompt "<<<<"
#define bufsize 50
char buffer[2048];
int version = 1;
char buf[bufsize];
char commandName[50];
char arg1[50];
char arg2[50];
//void parse(char *prompt,File *fp);
//void exec(char *commandName,char *arg1,char *arg2);
//void parse2(char *prompt,File *fp);
//void parr(char *prompt,File *fp);
void parse(FILE *fp);
void chaifen();
void exec(char *commandName,char *arg1,char *arg2);
void copy();
void copyOperation (int old,int new);
int main(){
while( 1)
{
int i;
//输出“$”提示符,等待用户输入命令行;
printf("<<<<<123 ");
parse(stdin);// 命令行; //命令行字符串分析:目标得出待运行程
//序的文件名 commandName,arg1,arg2
if (strcmp(buf,"logout\0")==0){
printf("logout2222");
break;}
else
chaifen();

//if(命令行==logout)
// exit( );

//if((i=fork( )) ==0 )
if ((i=fork())==0)
exec(commandName,arg1,arg2);
else
sleep(5);
}
return 0;
}


//void parse(char *prompt,File *fp)
void parse(FILE *fp)//char *prompt,
{

int i,j;

fgets(buf, bufsize, stdin);
printf("buf= %s",buf);
//fputs(buf,stdout);//fputs(fgets(s,80,stdin),stdout); 检验是不是把buf的内容输出


}

void chaifen()
{
int i,j;
//fflush(stdin);
for (i=0;(buf[i]!=' ')&&(buf[i]!='\n');i++)
{
// printf("11111111\n");
commandName[i]=buf[i];
// flag=1;
}
// printf("2222\n");

commandName[i]='\0';
// printf(" CommandName=%s\n",commandName);
j=0;
for (i=i+1;(buf[i]!=' ')&&(buf[i]!='\n');i++)
{
arg1[j]=buf[i];
j++;
}
arg1[j]='\0';
// printf(" arg1=%s\n",arg1);
j=0;
for (i=i+1;(buf[i]!=' ')&&(buf[i]!='\n');i++)
{
arg2[j]=buf[i];
j++;
}
arg2[j]='\0';
//printf(" arg2=%s\n",arg2);

}


void exec(char * commandName,char *arg1,char *arg2 )
{
if ( (strcmp(commandName,"copy")==0) &&(strcmp(arg1,"file1")==0)&&(strcmp(arg2,"file2")==0) )
copy();
else
printf("PID=%d!\n ",getpid());
}

void copy()
{
int i = 0;
int fdold,fdnew;
fdold = open("file1", O_RDONLY);
if(fdold == -1)
{
printf("can not open file %s\n","file1");
exit(1);
}
fdnew = creat("file2", 0666);
copyOperation (fdold, fdnew);
printf ("This is process %d\n", getpid() );
printf("Copy Done!From %s To %s\n", "file1","file2");
exit(0);

}



void copyOperation (int old,int new)

{
int count;

while ((count=read(old,buffer,sizeof(buffer)))>0)
write(new, buffer, count);
return;
}



[/C]


代码编译通过,不用全看,我只是输入了logout,按理说应该会退出while循环,后边的copy之类的都不会运行,但是却出现:段错误,核心已转储,求解释!!!!!


页首
 用户资料  
 
2 楼 
 文章标题 : Re: 运行报错:段错误,核心已转储,求帮忙!!!
帖子发表于 : 2013-03-16 19:47 
头像

注册: 2008-07-24 11:33
帖子: 4793
地址: 郑州
送出感谢: 4
接收感谢: 92
代码请用 [code][/code] 包起来,不然没法看。


_________________
求人不如求它仨: 天蓝的Wiki 屎黄的Wiki 绿
Site: CUIHAO.TK    Twitter: @cuihaoleo
Machine: Athlon64 X2 5200+ / 2x2GB DDR2-800 / GeForce GTS 450
AD: ~まだ見ぬ誰かの笑顔のために~


页首
 用户资料  
 
3 楼 
 文章标题 : Re: 运行报错:段错误,核心已转储,求帮忙!!!
帖子发表于 : 2013-03-16 20:06 

注册: 2013-03-03 10:45
帖子: 37
系统: ubuntu
送出感谢: 8
接收感谢: 0 次
恩,我知道了
代码:
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <stdlib.h>
#include <string.h>
#include <signal.h>
#include <sys/wait.h>
//#define prompt "<<<<"
#define bufsize 50
char buffer[2048];
int version = 1;
char buf[bufsize];
char commandName[50];
char arg1[50];
char arg2[50];
//void parse(char *prompt,File *fp);
//void exec(char *commandName,char *arg1,char *arg2);
//void parse2(char *prompt,File *fp);
//void parr(char *prompt,File *fp);
void parse(FILE *fp);
void chaifen();
void exec(char *commandName,char *arg1,char *arg2);
void copy();
void copyOperation (int old,int new);
int main(){
   while( 1)
   {
   int i;
   //输出“$”提示符,等待用户输入命令行;
printf("<<<<<123 ");
   parse(stdin);// 命令行; //命令行字符串分析:目标得出待运行程
//序的文件名 commandName,arg1,arg2
   if (strcmp(buf,"logout\0")==0){
 printf("logout2222");
   break;}
 else
 chaifen();

   //if(命令行==logout)
// exit( );

   //if((i=fork( )) ==0 )
if ((i=fork())==0)
   exec(commandName,arg1,arg2);
   else
   sleep(5);
   }
 return 0;
}


//void parse(char *prompt,File *fp)
void parse(FILE *fp)//char *prompt,
{

 int i,j;

 fgets(buf, bufsize, stdin);
 printf("buf= %s",buf);
 //fputs(buf,stdout);//fputs(fgets(s,80,stdin),stdout); 检验是不是把buf的内容输出


}

void chaifen()
{
 int i,j;
 //fflush(stdin);
 for (i=0;(buf[i]!=' ')&&(buf[i]!='\n');i++)
 {
 // printf("11111111\n");
 commandName[i]=buf[i];
 // flag=1;
 }
 // printf("2222\n");

 commandName[i]='\0';
 // printf(" CommandName=%s\n",commandName);
 j=0;
 for (i=i+1;(buf[i]!=' ')&&(buf[i]!='\n');i++)
 {
 arg1[j]=buf[i];
 j++;
 }
 arg1[j]='\0';
 // printf(" arg1=%s\n",arg1);
 j=0;
 for (i=i+1;(buf[i]!=' ')&&(buf[i]!='\n');i++)
 {
 arg2[j]=buf[i];
 j++;
 }
 arg2[j]='\0';
 //printf(" arg2=%s\n",arg2);

}


void exec(char * commandName,char *arg1,char *arg2 )
{
 if ( (strcmp(commandName,"copy")==0) &&(strcmp(arg1,"file1")==0)&&(strcmp(arg2,"file2")==0) )
 copy();
 else
 printf("PID=%d!\n ",getpid());
}

void copy()
{
 int i = 0;
 int fdold,fdnew;
 fdold = open("file1", O_RDONLY);
 if(fdold == -1)
 {
 printf("can not open file %s\n","file1");
 exit(1);
 }
 fdnew = creat("file2", 0666);
 copyOperation (fdold, fdnew);
 printf ("This is process %d\n", getpid() );
 printf("Copy Done!From %s To %s\n", "file1","file2");
 exit(0);

}



void copyOperation (int old,int new)

{
   int count;

   while ((count=read(old,buffer,sizeof(buffer)))>0)
   write(new, buffer, count);
 return;
}


页首
 用户资料  
 
4 楼 
 文章标题 : Re: 运行报错:段错误,核心已转储,求帮忙!!!
帖子发表于 : 2013-03-16 20:11 
头像

注册: 2008-07-24 11:33
帖子: 4793
地址: 郑州
送出感谢: 4
接收感谢: 92
噗,原来的缩进就是这样?一塌糊涂嘞……
算了,别管我了,我也不懂这。


_________________
求人不如求它仨: 天蓝的Wiki 屎黄的Wiki 绿
Site: CUIHAO.TK    Twitter: @cuihaoleo
Machine: Athlon64 X2 5200+ / 2x2GB DDR2-800 / GeForce GTS 450
AD: ~まだ見ぬ誰かの笑顔のために~


页首
 用户资料  
 
5 楼 
 文章标题 : Re: 运行报错:段错误,核心已转储,求帮忙!!!
帖子发表于 : 2013-03-16 20:11 

注册: 2010-07-19 21:41
帖子: 22323
系统: OS X
送出感谢: 8
接收感谢: 42
帮 lz 编辑了
下次不要重复发帖


_________________
NO DO NO DIE
http://a/%%30%30


页首
 用户资料  
 
6 楼 
 文章标题 : Re: 运行报错:段错误,核心已转储,求帮忙!!!
帖子发表于 : 2013-03-16 21:27 

注册: 2012-08-21 18:17
帖子: 116
送出感谢: 0 次
接收感谢: 8
使用gdb调试
代码:
GNU gdb (Ubuntu/Linaro 7.4-2012.04-0ubuntu2) 7.4-2012.04
Copyright (C) 2012 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "i686-linux-gnu".
For bug reporting instructions, please see:
<http://bugs.launchpad.net/gdb-linaro/>...
Reading symbols from /home/suntao/code...done.
(gdb) b 32
Breakpoint 1 at 0x80485cc: file code.c, line 32.
(gdb) r
Starting program: /home/suntao/code

Breakpoint 1, main () at code.c:32
32          parse(stdin);// 命令行; //命令行字符串分析:目标得出待运行程
(gdb) n
<<<<<123   logout
buf= logout
34          if (strcmp(buf,"logout\0")==0){
(gdb) n
38                  chaifen();
(gdb)

Program received signal SIGSEGV, Segmentation fault.
0x08048721 in chaifen () at code.c:81
81      for (i=i+1;(buf[i]!=' ')&&(buf[i]!='\n');i++)
(gdb) p i
$1 = 1760
(gdb)


可以看到出现段错误时,在chaifen函数里i的值已经是1760,buf数组越界了。
strcmp那里比较不相等,可以看一下fgets的用法,把最后的换行符变为\0。


_________________
我是一个程序员。



_________________
评价: 3.7% zero_hsy
 
页首
 用户资料  
 
7 楼 
 文章标题 : Re: 运行报错:段错误,核心已转储,求帮忙!!!
帖子发表于 : 2013-03-16 21:56 

注册: 2013-03-03 10:45
帖子: 37
系统: ubuntu
送出感谢: 8
接收感谢: 0 次
fgets应该没有问题,因为在下面一行我输出了 printf("buf= %s",buf);,结果输出了正确的,和输入的一样,说明调用了fgets(buf, bufsize, stdin); 已经添加了尾零,你运行的我也有试过,结果和你一样,所以我就不明白了:为什么它会跳过strcmp,反而直接进入chaifen()这个函数!!求解释啊


页首
 用户资料  
 
8 楼 
 文章标题 : Re: 运行报错:段错误,核心已转储,求帮忙!!!
帖子发表于 : 2013-03-16 22:13 

注册: 2013-03-03 10:45
帖子: 37
系统: ubuntu
送出感谢: 8
接收感谢: 0 次
我已经解决了,应该为: if (strcmp(buf,"logout\n")==0) 加一个 \n ,我真是妥妥的给它跪了。。。。。 :em02


页首
 用户资料  
 
9 楼 
 文章标题 : Re: 运行报错:段错误,核心已转储,求帮忙!!!
帖子发表于 : 2013-03-17 10:50 

注册: 2012-08-21 18:17
帖子: 116
送出感谢: 0 次
接收感谢: 8
zero_hsy 写道:
我已经解决了,应该为: if (strcmp(buf,"logout\n")==0) 加一个 \n ,我真是妥妥的给它跪了。。。。。 :em02

fgets是添加了\0,但在\0之前还有\n。您可以看看《UNIX环境高级编程》,里面讲了很多有关UNIX、Linux的知识如函数用法、信号等等。


_________________
我是一个程序员。


页首
 用户资料  
 
显示帖子 :  排序  
发表新帖 回复这个主题  [ 9 篇帖子 ] 

当前时区为 UTC + 8 小时


在线用户

正在浏览此版面的用户:没有注册用户 和 5 位游客


不能 在这个版面发表主题
不能 在这个版面回复主题
不能 在这个版面编辑帖子
不能 在这个版面删除帖子
不能 在这个版面提交附件

前往 :  
本站点为公益性站点,用于推广开源自由软件,由 DiaHosting VPSBudgetVM VPS 提供服务。
我们认为:软件应可免费取得,软件工具在各种语言环境下皆可使用,且不会有任何功能上的差异;
人们应有定制和修改软件的自由,且方式不受限制,只要他们自认为合适。

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
简体中文语系由 王笑宇 翻译