运行报错:段错误,核心已转储,求帮忙!!!

为当前最终发行版之前的所有版本提供支持
回复
zero_hsy
帖子: 37
注册时间: 2013-03-03 10:45
系统: ubuntu
送出感谢: 8 次
接收感谢: 0

运行报错:段错误,核心已转储,求帮忙!!!

#1

帖子 zero_hsy » 2013-03-16 18:47

自己写了一个简单的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!=' ')&&(buf!='\n');i++)
{
// printf("11111111\n");
commandName=buf;
// flag=1;
}
// printf("2222\n");

commandName='\0';
// printf(" CommandName=%s\n",commandName);
j=0;
for (i=i+1;(buf!=' ')&&(buf!='\n');i++)
{
arg1[j]=buf;
j++;
}
arg1[j]='\0';
// printf(" arg1=%s\n",arg1);
j=0;
for (i=i+1;(buf!=' ')&&(buf!='\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之类的都不会运行,但是却出现:段错误,核心已转储,求解释!!!!!
头像
cuihao
帖子: 4793
注册时间: 2008-07-24 11:33
来自: 郑州
送出感谢: 1 次
接收感谢: 89 次
联系:

Re: 运行报错:段错误,核心已转储,求帮忙!!!

#2

帖子 cuihao » 2013-03-16 19:47

代码请用 [code][/code] 包起来,不然没法看。
求人不如求它仨: 天蓝的Wiki 屎黄的Wiki 绿
Site: CUIHAO.TK    Twitter: @cuihaoleo
Machine: Athlon64 X2 5200+ / 2x2GB DDR2-800 / GeForce GTS 450
AD: ~まだ見ぬ誰かの笑顔のために~
zero_hsy
帖子: 37
注册时间: 2013-03-03 10:45
系统: ubuntu
送出感谢: 8 次
接收感谢: 0

Re: 运行报错:段错误,核心已转储,求帮忙!!!

#3

帖子 zero_hsy » 2013-03-16 20:06

恩,我知道了

代码: 全选

#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;
}
头像
cuihao
帖子: 4793
注册时间: 2008-07-24 11:33
来自: 郑州
送出感谢: 1 次
接收感谢: 89 次
联系:

Re: 运行报错:段错误,核心已转储,求帮忙!!!

#4

帖子 cuihao » 2013-03-16 20:11

噗,原来的缩进就是这样?一塌糊涂嘞……
算了,别管我了,我也不懂这。
求人不如求它仨: 天蓝的Wiki 屎黄的Wiki 绿
Site: CUIHAO.TK    Twitter: @cuihaoleo
Machine: Athlon64 X2 5200+ / 2x2GB DDR2-800 / GeForce GTS 450
AD: ~まだ見ぬ誰かの笑顔のために~
jtshs256
论坛版主
帖子: 22322
注册时间: 2010-07-19 21:41
系统: OS X
送出感谢: 2 次
接收感谢: 27 次

Re: 运行报错:段错误,核心已转储,求帮忙!!!

#5

帖子 jtshs256 » 2013-03-16 20:11

帮 lz 编辑了
下次不要重复发帖
NO DO NO DIE
http://a/%%30%30
buzzerrookie
帖子: 116
注册时间: 2012-08-21 18:17
送出感谢: 0
接收感谢: 8 次

Re: 运行报错:段错误,核心已转储,求帮忙!!!

#6

帖子 buzzerrookie » 2013-03-16 21:27

使用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。
这些用户感谢了作者 buzzerrookie 于这个帖子:
zero_hsy (2013-03-16 21:51)
评价: 3.7%
我是一个程序员。
zero_hsy
帖子: 37
注册时间: 2013-03-03 10:45
系统: ubuntu
送出感谢: 8 次
接收感谢: 0

Re: 运行报错:段错误,核心已转储,求帮忙!!!

#7

帖子 zero_hsy » 2013-03-16 21:56

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

Re: 运行报错:段错误,核心已转储,求帮忙!!!

#8

帖子 zero_hsy » 2013-03-16 22:13

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

Re: 运行报错:段错误,核心已转储,求帮忙!!!

#9

帖子 buzzerrookie » 2013-03-17 10:50

zero_hsy 写了:我已经解决了,应该为: if (strcmp(buf,"logout\n")==0) 加一个 \n ,我真是妥妥的给它跪了。。。。。 :em02
fgets是添加了\0,但在\0之前还有\n。您可以看看《UNIX环境高级编程》,里面讲了很多有关UNIX、Linux的知识如函数用法、信号等等。
我是一个程序员。
回复

回到 “老旧版本支持”