ورود

View Full Version : کسی می دونه error:segmentation fault یعنی چی؟



tazekaram
یک شنبه 21 مرداد 1386, 23:28 عصر
سلام
کسی می دونه error:segmentation fault یعنی چی؟
من یه برنامه تحت شبکه با سی توی لینوکس نوشتم ولی گاهی اوقات با تغییراتی که تو برنامه میدم این ارور رو می ده حتی وقتی دوباره برنامه رو به حالت قبل از این ارور برگردونم باز هم این ارور رو می ده؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟ ؟؟؟

hosseinzadeh
دوشنبه 22 مرداد 1386, 09:46 صبح
segmentation fault

An error in which a running Unix program attempts to access memory not allocated to it and terminates with a segmentation violation error and usually a core dump.


[http://www.cacs.louisiana.edu/~mgr/404/burks/foldoc/16/104.htm]

ایضا له:


A segmentation fault (often shortened to segfault) is a particular error condition that can occur during the operation of computer software. A segmentation fault occurs when a program attempts to access a memory location that it is not allowed to access, or attempts to access a memory location in a way that is not allowed (for example, attempting to write to a read-only location, or to overwrite part of the operating system). Systems based on processors like the Motorola 68000 tend to refer to these events as address or bus errors.

Segmentation is one approach to memory management and protection in the operating system. It has been superseded by paging for most purposes, but much of the terminology of segmentation is still used, "segmentation fault" being an example. Some operating systems still have segmentation at some logical level although paging is used as the main memory management policy.

On Unix-like operating systems, a process that accesses invalid memory receives the SIGSEGV signal. On Microsoft Windows, a process that accesses invalid memory receives the STATUS_ACCESS_VIOLATION exception.

یه مثال خوبم می تونی همین جا پیدا کنی.
http://en.wikipedia.org/wiki/Segmentation_fault

Mamdos
سه شنبه 23 مرداد 1386, 00:37 صبح
به عنوان یک تجربه‌ی خام و سرراست، این مشکل به طور کلی معمولاً وقتی پیش می‌آد که برنامه‌تون استثنا (Exception) می‌اندازد (هرچند این جمله دقیق نیست) چرا که معمولاً استثناها بر اثر دسترسی غیرمجاز به حافظه پیش می‌آیند. مثل اوقاتی که برنامه سعی می‌کند به عنصر n+1ام یک آرایه‌ی nعنصری دست بزند. در ویندوز به جای این پیغام خطا، همان پنجره‌ی «Send to Microsoft» نشان داده می‌شود.

احتمالاً یا مستقیماً به یک محل غیرمجاز از حافظه خواسته‌اید دست بزنید یا این که به یک تابع ورودی غیرمجاز داده‌اید.

tazekaram
چهارشنبه 24 مرداد 1386, 00:53 صبح
با تشکر
در واقع سوال من راجع به برنامه ای هست که دارم مینویسم
یه برنامه چت سرور که با سی توی لینوکسه
می تونید کمکم کنید تا جای دستور fork رو تو برنامم پیدا کنم؟ در واقع برنامه تا جایی پیش رفته که کلاینت با اسم خودش به سرور کانکت میشه بعد سرور اسمشو می گیره و در آرایه user میذاره حالا باید پیام های اونو به آدرس گیرنده (name2)که داخل پیام( استراکچر msg )هست بفرسته که name2 رو با تمام خانه های آرایه user (آرایه ای از استراکچر user با فیلد های IP,sockfd, name )مقایسه کنه و به sockfd ای بفرسته که name اون با name2 داخل پیام دریافتی یکی باشه...
و اینجا گیر کردم


/*chatserver*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>

#define PORT 9000
#define MAXDATASIZE 100
int main(void)
{
struct msg {
char payload[256];
char name1[30];
char name2[30];
};
struct msg msg[100];
// List of users connections to server
struct user {
int sockfd;
char IP[16];
char name[100];
};
struct user user[100];
fd_set master;
fd_set read_fds;
struct sockaddr_in myaddr;
struct sockaddr_in remoteaddr;
int fdmax;
int listener;
int newfd;
char buf[256];
int nbytes;
int yes=1;
int addrlen;
int i,j;
FD_ZERO(&master);
FD_ZERO(&read_fds);

if((listener=socket(AF_INET,SOCK_STREAM,0))==-1)
{ perror("socket");
exit(1);
}
if(setsockopt(listener,SOL_SOCKET,SO_REUSEADDR,&yes,sizeof(int))==-1)
{ perror("setsockopt");
exit(1);
}
myaddr.sin_family=AF_INET;
myaddr.sin_addr.s_addr=INADDR_ANY;
myaddr.sin_port=htons(PORT);

memset(&(myaddr.sin_zero),'\0',8);

if(bind(listener,(struct sockaddr *)&myaddr,sizeof(myaddr))==-1)
{ perror("bind error");
exit(1);
}
if(listen(listener,10)==-1)
{ perror("listen error");
exit(1);
}
FD_SET(listener,&master);
fdmax=listener;
for(;;)
{
read_fds=master;
if(select(fdmax+1,&read_fds,NULL,NULL,NULL)==-1)
{ perror("select error");
exit(1);
}
for(i=0;i<=fdmax;i++)
{
if(FD_ISSET(i,&read_fds))
{
if(i==listener)
{
addrlen=sizeof(remoteaddr);
if((newfd=accept(listener,(struct sockaddr *)&remoteaddr,&addrlen))==-1)
perror("accept error");
else{ FD_SET(newfd,&master);
if(newfd>fdmax)
fdmax=newfd;
// printf("select server:new connection from %s on socket %d\n",inet_ntoa(remoteaddr.sin_addr),newfd);
user[i].sockfd=newfd;
strcpy(user[i].IP,inet_ntoa(remoteaddr.sin_addr));
printf("select server:new connection from %s on socket %d\n",inet_ntoa(remoteaddr.sin_addr),newfd);
printf("%d\n",user[i].sockfd);
printf("%s\n",user[i].IP);
if((nbytes=recv(user[i].sockfd,msg,sizeof(msg),0))<=0)
{ if(nbytes==0)
{ printf("select server:socket %d hang up\n",user[i].sockfd);
} else{ perror("recv error");
} close(user[i].sockfd);
FD_CLR(user[i].sockfd,&master);
}
strcpy(user[i].name,msg[0].payload);
printf("%s\n",user[i].name);

}

} else {
if((nbytes=recv(i,msg,sizeof(msg),0))<=0)
{ if(nbytes==0)
{ printf("select server:socket %d hang up\n",i);
} else{ perror("recv error");
} close(i);
FD_CLR(i,&master);
} else { printf("%s",msg[0].payload);printf("%s\n",msg[0].name2);
for(j=0;j<=fdmax;j++)
{ if(FD_ISSET(j,&master))
{if((j!=listener)&&(j!=i)/*||(strcmp(user[j].name,msg[0].name2)==0)*/)
{ if(send(j,msg,nbytes,0)==-1)
{perror("send error");
}
}
}
}
}
}
}//if(FD_ISSET(i,&read_fds))
}//for(i=0;i<=fdmax;i++)
}//for(;;)
}//END
/*chatserver*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>

#define PORT 9000
#define MAXDATASIZE 100
int main(void)
{
struct msg {
char payload[256];
char name1[30];
char name2[30];
};
struct msg msg[100];
// List of users connections to server
struct user {
int sockfd;
char IP[16];
char name[100];
};
struct user user[100];
fd_set master;
fd_set read_fds;
struct sockaddr_in myaddr;
struct sockaddr_in remoteaddr;
int fdmax;
int listener;
int newfd;
char buf[256];
int nbytes;
int yes=1;
int addrlen;
int i,j;
FD_ZERO(&master);
FD_ZERO(&read_fds);

if((listener=socket(AF_INET,SOCK_STREAM,0))==-1)
{ perror("socket");
exit(1);
}
if(setsockopt(listener,SOL_SOCKET,SO_REUSEADDR,&yes,sizeof(int))==-1)
{ perror("setsockopt");
exit(1);
}
myaddr.sin_family=AF_INET;
myaddr.sin_addr.s_addr=INADDR_ANY;
myaddr.sin_port=htons(PORT);

memset(&(myaddr.sin_zero),'\0',8);

if(bind(listener,(struct sockaddr *)&myaddr,sizeof(myaddr))==-1)
{ perror("bind error");
exit(1);
}
if(listen(listener,10)==-1)
{ perror("listen error");
exit(1);
}
FD_SET(listener,&master);
fdmax=listener;
for(;;)
{
read_fds=master;
if(select(fdmax+1,&read_fds,NULL,NULL,NULL)==-1)
{ perror("select error");
exit(1);
}
for(i=0;i<=fdmax;i++)
{
if(FD_ISSET(i,&read_fds))
{
if(i==listener)
{
addrlen=sizeof(remoteaddr);
if((newfd=accept(listener,(struct sockaddr *)&remoteaddr,&addrlen))==-1)
perror("accept error");
else{ FD_SET(newfd,&master);
if(newfd>fdmax)
fdmax=newfd;
// printf("select server:new connection from %s on socket %d\n",inet_ntoa(remoteaddr.sin_addr),newfd);
user[i].sockfd=newfd;
strcpy(user[i].IP,inet_ntoa(remoteaddr.sin_addr));
printf("select server:new connection from %s on socket %d\n",inet_ntoa(remoteaddr.sin_addr),newfd);
printf("%d\n",user[i].sockfd);
printf("%s\n",user[i].IP);
if((nbytes=recv(user[i].sockfd,msg,sizeof(msg),0))<=0)
{ if(nbytes==0)
{ printf("select server:socket %d hang up\n",user[i].sockfd);
} else{ perror("recv error");
} close(user[i].sockfd);
FD_CLR(user[i].sockfd,&master);
}
strcpy(user[i].name,msg[0].payload);
printf("%s\n",user[i].name);

}

} else {
if((nbytes=recv(i,msg,sizeof(msg),0))<=0)
{ if(nbytes==0)
{ printf("select server:socket %d hang up\n",i);
} else{ perror("recv error");
} close(i);
FD_CLR(i,&master);
} else { printf("%s",msg[0].payload);printf("%s\n",msg[0].name2);
for(j=0;j<=fdmax;j++)
{ if(FD_ISSET(j,&master))
{if((j!=listener)&&(j!=i)/*||(strcmp(user[j].name,msg[0].name2)==0)*/)
{ if(send(j,msg,nbytes,0)==-1)
{perror("send error");
}
}
}
}
}
}
}//if(FD_ISSET(i,&read_fds))
}//for(i=0;i<=fdmax;i++)
}//for(;;)
}//END


و کد کلاینت


/*client*/
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <string.h>
#define PORT 9000
#define MAXDATASIZE 100
void error(char *MSG)
{
perror(MSG);
exit(0);
}
int main(int argc, char *argv[])
{
int sockfd, portno, n;
struct sockaddr_in serv_addr;
struct hostent *server;
struct msg {
char payload[256];
char name1[30];
char name2[30];
};
struct msg msg[100];
char buffer[256];
if (argc < 3) {
fprintf(stderr,"usage %s hostname yourname\n", argv[0]);
exit(0);
}
// portno = atoi(argv[2]);
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0)
error("ERROR opening socket");
server = gethostbyname(argv[1]);
if (server == NULL) {
fprintf(stderr,"ERROR, no such host\n");
exit(0);
}
bzero((char *) &serv_addr, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
bcopy((char *)server->h_addr,
(char *)&serv_addr.sin_addr.s_addr,
server->h_length);
serv_addr.sin_port = htons(PORT);
if (connect(sockfd,(struct sockaddr *)&serv_addr,sizeof(struct sockaddr)) < 0)
error("ERROR connecting");

strcpy(msg[0].payload,argv[2]);
printf("%s\n",argv[2]);
n = write(sockfd,msg,strlen(msg[0].payload));
if (n < 0)
error("ERROR writing to socket");
strcpy(msg[0].name1,argv[2]);
printf("talk to...");
fgets(msg[0].name2,30,stdin);
/* printf("your meesage...");
fgets(msg[0].payload,255,stdin);
n = write(sockfd,msg,sizeof(msg));
if (n < 0)
error("ERROR writing to socket");*/
// bzero(buffer,256);
while(strcasecmp(msg[0].payload,"bye\n")!=0) {
bzero(msg[0].payload,256);
printf("Please enter the message: ");
fgets(msg[0].payload,255,stdin);
n = write(sockfd,msg,sizeof(msg));
if (n < 0)
error("ERROR writing to socket");
bzero(msg[0].payload,256);
n = read(sockfd,msg,sizeof(msg));
if (n < 0)
error("ERROR reading from socket");
printf("Here is the message: %s\n",msg[0].payload);

}//while*/
}
/*client*/
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <string.h>
#define PORT 9000
#define MAXDATASIZE 100
void error(char *MSG)
{
perror(MSG);
exit(0);
}
int main(int argc, char *argv[])
{
int sockfd, portno, n;
struct sockaddr_in serv_addr;
struct hostent *server;
struct msg {
char payload[256];
char name1[30];
char name2[30];
};
struct msg msg[100];
char buffer[256];
if (argc < 3) {
fprintf(stderr,"usage %s hostname yourname\n", argv[0]);
exit(0);
}
// portno = atoi(argv[2]);
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0)
error("ERROR opening socket");
server = gethostbyname(argv[1]);
if (server == NULL) {
fprintf(stderr,"ERROR, no such host\n");
exit(0);
}
bzero((char *) &serv_addr, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
bcopy((char *)server->h_addr,
(char *)&serv_addr.sin_addr.s_addr,
server->h_length);
serv_addr.sin_port = htons(PORT);
if (connect(sockfd,(struct sockaddr *)&serv_addr,sizeof(struct sockaddr)) < 0)
error("ERROR connecting");

strcpy(msg[0].payload,argv[2]);
printf("%s\n",argv[2]);
n = write(sockfd,msg,strlen(msg[0].payload));
if (n < 0)
error("ERROR writing to socket");
strcpy(msg[0].name1,argv[2]);
printf("talk to...");
fgets(msg[0].name2,30,stdin);
/* printf("your meesage...");
fgets(msg[0].payload,255,stdin);
n = write(sockfd,msg,sizeof(msg));
if (n < 0)
error("ERROR writing to socket");*/
// bzero(buffer,256);
while(strcasecmp(msg[0].payload,"bye\n")!=0) {
bzero(msg[0].payload,256);
printf("Please enter the message: ");
fgets(msg[0].payload,255,stdin);
n = write(sockfd,msg,sizeof(msg));
if (n < 0)
error("ERROR writing to socket");
bzero(msg[0].payload,256);
n = read(sockfd,msg,sizeof(msg));
if (n < 0)
error("ERROR reading from socket");
printf("Here is the message: %s\n",msg[0].payload);

}//while*/
}