powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Segmentation fault
6 сообщений из 6, страница 1 из 1
Segmentation fault
    #33201817
Geminis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Помогите исправить ошибки. По памяти набросал под Линух такой код, который в итоге будет подключаться к серверу БД 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
Segmentation fault
    #33201909
redskin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
man malloc
man free
...
Рейтинг: 0 / 0
Segmentation fault
    #33201941
Geminis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
redskinman malloc
man free
пишу
char *readbuf=(char*)malloc(32);
Но все равно - под линухом все оки, а после привязки к FB - выводит результат "0"... :(
...
Рейтинг: 0 / 0
Segmentation fault
    #33202043
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.
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
Segmentation fault
    #33202482
Geminis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Segmentation fault
    #33204922
Geminis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В итоге замутил такое вот:
Код: 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
6 сообщений из 6, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Segmentation fault
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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