Люди добрые, нужна помощь, в общем картина следующая, есть буфер FIFO, есть ком-порт. Задача хочу запихнуть в поток следующий процесс: читаем буфер FIFO, и если в нем что-то есть, то выкидываем в ком-порт. Проблема собственно вот в чем, когда без потока, то все отлично работает, как только поток, получаю следующиее:
*** buffer overflow detected ***: ./delta terminated
======= Backtrace: =========
/lib/i386-linux-gnu/libc.so.6(__fortify_fail+0x50)[0xb7488df0]
/lib/i386-linux-gnu/libc.so.6(+0xe4cca)[0xb7487cca]
/lib/i386-linux-gnu/libc.so.6(+0xe42a9)[0xb74872a9]
./delta[0x8048e80]
/lib/i386-linux-gnu/libpthread.so.0(+0x5e99)[0xb7636e99]
/lib/i386-linux-gnu/libc.so.6(clone+0x5e)[0xb747373e]
======= Memory map: ========
08048000-0804a000 r-xp 00000000 fb:00 524311 /usr/src/smas/smasclient2/delta/delta
0804a000-0804b000 r--p 00001000 fb:00 524311 /usr/src/smas/smasclient2/delta/delta
0804b000-0804c000 rw-p 00002000 fb:00 524311 /usr/src/smas/smasclient2/delta/delta
08f14000-08f35000 rw-p 00000000 00:00 0 [heap]
b6b8a000-b6b8b000 ---p 00000000 00:00 0
b6b8b000-b738d000 rw-p 00000000 00:00 0
b738d000-b73a0000 r-xp 00000000 fb:00 30015724 /lib/i386-linux-gnu/libz.so.1.2.3.4
b73a0000-b73a1000 r--p 00012000 fb:00 30015724 /lib/i386-linux-gnu/libz.so.1.2.3.4
b73a1000-b73a2000 rw-p 00013000 fb:00 30015724 /lib/i386-linux-gnu/libz.so.1.2.3.4
b73a2000-b73a3000 rw-p 00000000 00:00 0
b73a3000-b74fd000 r-xp 00000000 fb:00 30015505 /lib/i386-linux-gnu/libc-2.13.so
b74fd000-b74fe000 ---p 0015a000 fb:00 30015505 /lib/i386-linux-gnu/libc-2.13.so
b74fe000-b7500000 r--p 0015a000 fb:00 30015505 /lib/i386-linux-gnu/libc-2.13.so
b7500000-b7501000 rw-p 0015c000 fb:00 30015505 /lib/i386-linux-gnu/libc-2.13.so
b7501000-b7504000 rw-p 00000000 00:00 0
b7504000-b751e000 r-xp 00000000 fb:00 30015532 /lib/i386-linux-gnu/libgcc_s.so.1
b751e000-b751f000 r--p 00019000 fb:00 30015532 /lib/i386-linux-gnu/libgcc_s.so.1
b751f000-b7520000 rw-p 0001a000 fb:00 30015532 /lib/i386-linux-gnu/libgcc_s.so.1
b7520000-b7544000 r-xp 00000000 fb:00 30015527 /lib/i386-linux-gnu/libm-2.13.so
b7544000-b7545000 r--p 00023000 fb:00 30015527 /lib/i386-linux-gnu/libm-2.13.so
b7545000-b7546000 rw-p 00024000 fb:00 30015527 /lib/i386-linux-gnu/libm-2.13.so
b7546000-b7625000 r-xp 00000000 fb:00 28840432 /usr/lib/i386-linux-gnu/libstdc++.so.6.0.14
b7625000-b7629000 r--p 000de000 fb:00 28840432 /usr/lib/i386-linux-gnu/libstdc++.so.6.0.14
b7629000-b762a000 rw-p 000e2000 fb:00 28840432 /usr/lib/i386-linux-gnu/libstdc++.so.6.0.14
b762a000-b7631000 rw-p 00000000 00:00 0
b7631000-b7646000 r-xp 00000000 fb:00 30015523 /lib/i386-linux-gnu/libpthread-2.13.so
b7646000-b7647000 r--p 00015000 fb:00 30015523 /lib/i386-linux-gnu/libpthread-2.13.so
b7647000-b7648000 rw-p 00016000 fb:00 30015523 /lib/i386-linux-gnu/libpthread-2.13.so
b7648000-b764b000 rw-p 00000000 00:00 0
b764b000-b77ea000 r-xp 00000000 fb:00 28847085 /usr/lib/libmysqlclient.so.16.0.0
b77ea000-b77ed000 r--p 0019e000 fb:00 28847085 /usr/lib/libmysqlclient.so.16.0.0
b77ed000-b7832000 rw-p 001a1000 fb:00 28847085 /usr/lib/libmysqlclient.so.16.0.0
b7832000-b7833000 rw-p 00000000 00:00 0
b7833000-b783a000 r-xp 00000000 fb:00 30015507 /lib/i386-linux-gnu/librt-2.13.so
b783a000-b783b000 r--p 00006000 fb:00 30015507 /lib/i386-linux-gnu/librt-2.13.so
b783b000-b783c000 rw-p 00007000 fb:00 30015507 /lib/i386-linux-gnu/librt-2.13.so
b783f000-b7844000 rw-p 00000000 00:00 0
b7844000-b7845000 r-xp 00000000 00:00 0 [vdso]
b7845000-b7861000 r-xp 00000000 fb:00 30015528 /lib/i386-linux-gnu/ld-2.13.so
b7861000-b7862000 r--p 0001b000 fb:00 30015528 /lib/i386-linux-gnu/ld-2.13.so
b7862000-b7863000 rw-p 0001c000 fb:00 30015528 /lib/i386-linux-gnu/ld-2.13.so
bff28000-bff49000 rw-p 00000000 00:00 0 [stack]
Аварийный останов
Сам код функции потока:
void * cDeltaCom::dcom(void *arg)
{
int q=0;
FILE * f;
struct termios opt;
struct sDeltaCom *set=(struct sDeltaCom *)arg;
cLog log(1,set->LogFile,«SMAS To Delta stack»);
log.log(1,«Openning COM-Port: %s»,set->Port);
int p;
log.log(1,«COM-Port is opened»);
umask(0);
mknod(set->Fifo,S_IFIFO|0666,0);
p=open(set->Port,O_RDWR | O_NOCTTY | O_NDELAY);
if (p==-1)
{
return NULL;
}
fcntl(p,F_SETFL,0);
tcgetattr(p,&opt);
opt.c_cflag |=CS8;
opt.c_cflag &=~PARENB;
opt.c_cflag &=~CSTOPB;
opt.c_cflag &=~CRTSCTS;
opt.c_cflag |=CREAD;
opt.c_cflag |=CLOCAL;
opt.c_cflag |=~OPOST;
cfsetispeed(&opt,B9600);
cfsetospeed(&opt,B9600);
tcsetattr(p,TCSAFLUSH,&opt);
tcflush(p,TCIOFLUSH);
while (1)
{
unsigned char buf[5];
int tmpnum;
int objnum;
char *s;
char bf[128]="";
int Code=0,Message=0;
char tmp[64]="";
f=fopen(set->Fifo,«r»);
s=fgets(bf,128,f);
bf[strlen(bf)-1]=0;
s=strchr(bf,'-');
strncpy(tmp,bf,s-bf);
tmp[s-bf]=0;
s++;
q=write (p,buf,sizeof(buf)-1);
int status;
ioctl(p,TIOCMGET,&status);
status &=~TIOCM_DTR;
ioctl(p,TIOCMSET,status);
fclose(f);
}
close(p);
}
Пожалуйста, СПАСИТЕ....