Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Segmentation fault / 6 сообщений из 6, страница 1 из 1
04.08.2005, 14:41
    #33201817
Geminis
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Segmentation fault
Помогите исправить ошибки. По памяти набросал под Линух такой код, который в итоге будет подключаться к серверу БД Firebird как UDF.
Компилирую строчкой
gcc -o fout -shared my.c
Понимаю, что должна выделяться память - а как правильно - не знаю...
Помогите, плиззззз!!!!
Вот собственно my.c :
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
#include <stdio.h>

char *CheckIt(int i)
{
char *readbuf, *cmd, *res;
cmd = "cat /tmp/server.key";
res = "0";

FILE *pipein_fp;

if (( pipein_fp = popen(cmd, "r")) != NULL)
 {
   if (system(cmd) ==  0 )
    {
     fgets(readbuf,  32 , pipein_fp);
     res = readbuf;
    }
   pclose(pipein_fp);
 }
return res;
}
...
Рейтинг: 0 / 0
04.08.2005, 15:07
    #33201909
redskin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Segmentation fault
man malloc
man free
...
Рейтинг: 0 / 0
04.08.2005, 15:19
    #33201941
Geminis
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Segmentation fault
redskinman malloc
man free
пишу
char *readbuf=(char*)malloc(32);
Но все равно - под линухом все оки, а после привязки к FB - выводит результат "0"... :(
...
Рейтинг: 0 / 0
04.08.2005, 15:48
    #33202043
redskin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Segmentation fault
Не знаю, что такое FB (никогда не имел с этим дело), но IMHO проверку значений возвращемых функциями в т.ч. malloc, popen и пр. надо делать. Хотя бы так (набросал на коленке, за стиль и форматирование не пинать, плз):

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>

char *CheckIt(const char* fname)
{
	char *readbuf =  0 ;
	char *res =  0 ;
	char cmd[ 256 ]; 
	const int buf_size =  32 ;
	FILE *pipein_fp;

	sprintf(cmd, "cat %s", fname);

	readbuf = (char*)malloc(buf_size);
	if( readbuf && ( ( pipein_fp = popen(cmd, "r")) != NULL) )
	{
		if (system(cmd) ==  0 )
		{
			fgets(readbuf, buf_size, pipein_fp);
			res = readbuf;
    		}
		pclose(pipein_fp);
 	}
	else
	{
		perror("ops");
	}

	return res;
}


int main(int argc, char *argv[])
{

	if(argc >  1 )
	{
		char *res = CheckIt(argv[ 1 ]);
		if(res)
		{		
			printf("%s", res);
			free(res);
		}
	}	
	return  0 ;
}


...
Рейтинг: 0 / 0
04.08.2005, 18:03
    #33202482
Geminis
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Segmentation fault
redskinНе знаю, что такое FB (никогда не имел с этим дело), но IMHO проверку значений возвращемых функциями в т.ч. malloc, popen и пр. надо делать. Хотя бы так (набросал на коленке, за стиль и форматирование не пинать, плз):

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>

char *CheckIt(const char* fname)
{
	char *readbuf =  0 ;
	char *res =  0 ;
	char cmd[ 256 ]; 
	const int buf_size =  32 ;
	FILE *pipein_fp;

	sprintf(cmd, "cat %s", fname);

	readbuf = (char*)malloc(buf_size);
	if( readbuf && ( ( pipein_fp = popen(cmd, "r")) != NULL) )
	{
		if (system(cmd) ==  0 )
		{
			fgets(readbuf, buf_size, pipein_fp);
			res = readbuf;
    		}
		pclose(pipein_fp);
 	}
	else
	{
		perror("ops");
	}

	return res;
}


int main(int argc, char *argv[])
{

	if(argc >  1 )
	{
		char *res = CheckIt(argv[ 1 ]);
		if(res)
		{		
			printf("%s", res);
			free(res);
		}
	}	
	return  0 ;
}



Спасибо! Попробую так...
...
Рейтинг: 0 / 0
05.08.2005, 18:29
    #33204922
Geminis
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Segmentation fault
В итоге замутил такое вот:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
#include <stdio.h>
#include <stdlib.h>

unsigned char* CheckIt(int i)
{
 unsigned char *s = (unsigned char*) malloc ( 33 );
// if (i != 82) { sprintf(s, "Err1"); return s; } - почему-то срабатывало всегда... :(
 char *cmd = "cat /tmp/server.key";
 char buf[ 32 ];
 FILE *ptr;
 if ((ptr = popen(cmd, "r")) != NULL)  //заметьте - без pclose! иначе пишет "broken pipe" !!!
   if (fgets(buf,  32 , ptr) != NULL)
     (void) sprintf(s, buf);
   else
     (void) sprintf(s, "Err2");
 return s;
}


компилирую: gcc -o mylib -shared n.c
Если файл /tmp/server.key не найден, то сервер Firebid, к которому подключается эта библиотека, "умирает":

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
server(Server) Fri Aug   5   17 : 21 : 35   2005 
        Fatal lock manager error: remap failed, errno:  22 

server(Client) Fri Aug   5   17 : 21 : 35   2005 
        /opt/firebird/bin/fbguard: bin/fbserver terminated abnormally ( 1 )


server(Client) Fri Aug   5   17 : 21 : 35   2005 
        /opt/firebird/bin/fbguard: guardian starting bin/fbserver


server(Server) Fri Aug   5   17 : 22 : 37   2005 
        Fatal lock manager error: remap failed, errno:  2 

server(Client) Fri Aug   5   17 : 22 : 37   2005 
        /opt/firebird/bin/fbguard: bin/fbserver terminated abnormally ( 1 )


server (Client) Fri Aug   5   17 : 22 : 37   2005 
        /opt/firebird/bin/fbguard: guardian starting bin/fbserver


???
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Segmentation fault / 6 сообщений из 6, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]