popen / pclose error

6 отговора 236 прегледа
#1

popen / pclose error

Здравейте!
При изпълнение на следния код:

FILE *xxl = popen("/bin/more") ;
int i = 0 ;
for (i = 0 ; i < 100; i++)
{
fprintf(xxl, "blallsdflfsdlfsdfsdfsdfsdf\n") ;
}
pclose(xxl) ;


се генерира segmentation fault, когато изпълнимия файл е link-нат като shared. като е статик всичко си върви.
Въпроса ми е дали някой от вас може да ми каже защо става така.

Платформата е Linux, ядро 2.4.8, компилатор GCC 2.96

Предварително благодаря за помоща.

Отговор
в отговор на darklord #2

Re: popen / pclose error

Probvay (edno ot) dve neshta:

1. Pusni go sys strace i porazgleday dumpa.
2. Pusni go prez gdb, i kato poluchi signala i spre, vij kyde e s komandata backtrace.

I dvete obshto vzeto imat edna cel - da vidish kyde se poluchava signalyt. Syvsem ne e zadyljitelno da e v tvoya kod.

Otkriyte greshkite: [линк]
Отговор
в отговор на Potencialen emigrant #3

Re: popen / pclose error

гърми вътре в pclose -> и то като се опитва да деалокира паметта - free().

Отговор
в отговор на darklord #4

Re: popen / pclose error

Prekaleno nespecifichno :-)
Proveri dali statichnoto i dinamichnoto libc ne sa ot razlichna versiya na glibc (t.e. razlichni paketi).
Proveri syshto dali .so-to, kym koeto se link-vash buildtime s syshtoto i v runtime. Stava s ldd.

Otkriyte greshkite: [линк]
Отговор
в отговор на Potencialen emigrant #5

Re: popen / pclose error

.. още една забавна подробност. същия проблем се появява и на друга инсталация -> с друго gcc и библиотеки. Така че предположението че съм се омазал аз отпада. Като се прибера в къщо ще проверя какво е положението с библиотеките все пак.

Отговор
в отговор на darklord #6

Re: popen / pclose error

FILE *xxl = popen("/bin/more","wt") ;

Отговор
в отговор на qwerty #7

Re: popen / pclose error

Ето я и работеща:
#include <stdio.h>

int
main()
{
FILE *xxl = popen("/bin/more","w") ;
if ( xxl == 0 )
{
perror("Error:");
return 0;
}
int i = 0 ;
for (i = 0 ; i < 100; i++)
{
fprintf(xxl, "blallsdflfsdlfsdfsdfsdfsdf") ;
fflush(xxl);
}
pclose(xxl) ;
}

Отговор