Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: 6318
Последний выпуск: 19.06.2015

segmentation fault

37K
02 февраля 2011 года
qbikk
40 / / 08.09.2010
привет всем.
при вызове функции 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;
}
конец листинга
277
02 февраля 2011 года
arrjj
1.7K / / 26.01.2011
Код int initstartdate() покажи

Да и getcwd((char*)NULL, 64); както неправильно выглядит
37K
02 февраля 2011 года
qbikk
40 / / 08.09.2010
я проверял что в filepath находится перед вызовом execl() : "/home/usr/resnet"... так что там вроде бы все прально робит...
277
02 февраля 2011 года
arrjj
1.7K / / 26.01.2011
Да с getcwd((char*)NULL, 64); всё в порядке, так что в initstartdate?
37K
02 февраля 2011 года
qbikk
40 / / 08.09.2010
а... стоп, чет ща не то выдало) сейчас перепроверим...
37K
02 февраля 2011 года
qbikk
40 / / 08.09.2010
перед вызовом initstartdate() filepath содержит "/home/david/proekt/resnet"
после вызова "/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;
}
277
02 февраля 2011 года
arrjj
1.7K / / 26.01.2011
 
Код:
for( ; i!=0 ; )

а while не неканает? :)
А что в sysdata.ip/port? Зачем ещё указывать аргумент (char*)0 для дочернего процесса? Может ошибка не в твоём коде а в дочернем процессе?
P.S. оформляй плз код CODE тэгом.
37K
02 февраля 2011 года
qbikk
40 / / 08.09.2010
)
да не, трабла в том что initstartdate почему-то изменяет filepath где находится путь к вызываемой проге... и так как он ее не находит, то дает ошибку.. ну как я понял))
а вот почему изменяет я безпонятия О_о
277
02 февраля 2011 года
arrjj
1.7K / / 26.01.2011
 
Код:
strcpy(filepath, pr_name);
.....
strcpy(j,SYSCONF);


Вот два изменения filepath в initstartdate.
И проверь (раз имя файла неправильное) что выдает fopen в if ((fp = fopen( filepath, "r"))==NULL) NULL или валидный поинтер?

Знаете кого-то, кто может ответить? Поделитесь с ним ссылкой.

Ваш ответ

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог