segmentation fault
при вызове функции execl(); выдает ошибку: segmentation fault (core dumped).
ОС МСВС 3.0
листинг:
#define FILENAME "/resnet"
struct {
char* ip;
char* port;
} sysdata;
int proc_err(int err, char *errstr)
{
//обработка ошибок
exit(1);
}
int initstartdate()
{
//инициализация начальных данных: sysdata.ip sysdata.port
return 0;
}
int main( int argc, char **argv)
{
filepath = getcwd((char*)NULL, 64);
strcat(filepath, FILENAME);
initstartdate();
pipe(fd);
if ( (pid = fork()) > 0 )
{
if ( execl( filepath, "resnet", sysdata.ip, sysdata.port, (char*) 0 ) == -1)
proc_err(errno, "execl(): ");
return 1;
}
//листинг дочернего процесса
return 0;
}
конец листинга
Да и getcwd((char*)NULL, 64); както неправильно выглядит
я проверял что в filepath находится перед вызовом execl() : "/home/usr/resnet"... так что там вроде бы все прально робит...
Да с getcwd((char*)NULL, 64); всё в порядке, так что в initstartdate?
а... стоп, чет ща не то выдало) сейчас перепроверим...
после вызова "/home/david/proekt/ri"
листинг initstartdate :
int initstartdate()
{
char *i,*j;
FILE *fp;
char *reserv;
char *vostan;
char *mode;
char *filepath;
int ret;
ret=0;
sysdata.ip = malloc(MY_PATH_MAX);
sysdata.port = malloc(MY_PATH_MAX);
userdata.inpath = malloc(MY_PATH_MAX);
userdata.outpath = malloc(MY_PATH_MAX);
reserv = malloc(MY_PATH_MAX);
vostan = malloc(MY_PATH_MAX);
filepath = malloc(MY_PATH_MAX);
mode = malloc(MY_PATH_MAX);
strcpy(filepath, pr_name);
i = strchr(filepath, '/');
for(;i!=0;)
{
j = i;
i = strchr(j+1, '/');
}
strcpy(j,SYSCONF);
if ((fp = fopen( filepath, "r"))==NULL)
ret=errno;
if (fseek( fp, 4, SEEK_SET))
ret=errno;
if (fgets( sysdata.ip, MAXLENSTR, fp)==NULL)
ret=errno;
if (fseek( fp, 6, SEEK_CUR))
ret=errno;
if (fgets( sysdata.port, MAXLENSTR, fp)==NULL)
ret=errno;
if (fseek( fp, 8, SEEK_CUR))
ret=errno;
if (fgets( reserv, MAXLENSTR, fp)==NULL)
ret=errno;
if (fseek( fp, 8, SEEK_CUR))
ret=errno;
if (fgets( vostan, MAXLENSTR, fp)==NULL)
ret=errno;
if (fclose(fp)==EOF)
ret=errno;
strcpy(j,USERCONF);
if ((fp = fopen( filepath, "r"))==NULL)
ret=errno;
if (fseek( fp, 8, SEEK_SET))
ret=errno;
if (fgets( userdata.inpath, MAXLENSTR, fp)==NULL)
ret=errno;
if (fseek( fp, 9, SEEK_CUR))
ret=errno;
if (fgets( userdata.outpath, MAXLENSTR, fp)==NULL)
ret=errno;
if (fseek( fp, 6, SEEK_CUR))
ret=errno;
if (fgets( mode, MAXLENSTR, fp)==NULL)
ret=errno;
if (fclose(fp)==EOF)
ret=errno;
userdata.inpath[strlen(userdata.inpath)-1]=0;
userdata.outpath[strlen(userdata.outpath)-1]=0;
sysdata.ip[strlen(sysdata.ip)-1]=0;
sysdata.port[strlen(sysdata.port)-1]=0;
reserv[strlen(reserv)-1]=0;
vostan[strlen(vostan)-1]=0;
mode[strlen(mode)-1]=0;
RESERV = todigit(reserv);
VOSTAN = todigit(vostan);
userdata.mode = todigit(mode);
return ret;
}
Код:
for( ; i!=0 ; )
а while не неканает? :)
А что в sysdata.ip/port? Зачем ещё указывать аргумент (char*)0 для дочернего процесса? Может ошибка не в твоём коде а в дочернем процессе?
P.S. оформляй плз код CODE тэгом.
да не, трабла в том что initstartdate почему-то изменяет filepath где находится путь к вызываемой проге... и так как он ее не находит, то дает ошибку.. ну как я понял))
а вот почему изменяет я безпонятия О_о
Код:
strcpy(filepath, pr_name);
.....
strcpy(j,SYSCONF);
.....
strcpy(j,SYSCONF);
Вот два изменения filepath в initstartdate.
И проверь (раз имя файла неправильное) что выдает fopen в if ((fp = fopen( filepath, "r"))==NULL) NULL или валидный поинтер?