LINUX.ORG.RU

а такой bt кому-нибуть что-нибуть говорит???


0

0

#0  0x400a76f1 in do_sigsuspend () from /lib/libc.so.6
#1  0x40035208 in __pthread_wait_for_restart_signal () from /lib/libpthread.so.0
#2  0x4003707c in __pthread_alt_lock () from /lib/libpthread.so.0
#3  0x400339b7 in pthread_mutex_lock () from /lib/libpthread.so.0
#4  0x4015b37c in vsyslog () from /lib/libc.so.6
#5  0x4015aedd in syslog () from /lib/libc.so.6
#6  0x0804d011 in sighandler_sigchild (signo=1075514424) at agent_signals.c:21
#7  0x40038bd5 in __pthread_sighandler () from /lib/libpthread.so.0
#8  <signal handler called>
#9  0x4015fb44 in send () from /lib/libc.so.6
#10 0x4015b1d6 in vsyslog () from /lib/libc.so.6
#11 0x4015aedd in syslog () from /lib/libc.so.6
#12 0x08049955 in main (argc=2, argv=0xbffff534) at track_agent.c:94
★★★★★

Re: а такой bt кому-нибуть что-нибуть говорит???

Лично у меня такой лог вызывает предположение о том, что в обработчике сигнала не нужно использовать syslog.

anonymous
()

Re: а такой bt кому-нибуть что-нибуть говорит???

> а какие альтернативы???

уважаемый cvv, я вас очень прошу - почитайте книги. после прочтения у вас отпадёт большая часть вопросов, которые вы задавали в этом форуме в течении последнего месяца. этим вы сэккономите массу времени и себе и окружающим вас людям.

минимальная наводка, если у вас не получается купить того же Стивенса:

http://ianzag.megasignal.com/ftp/pub/doc/books/UNIX/Unix%20Systems%20Programm...
http://ianzag.megasignal.com/ftp/pub/doc/books/Linux/Advanced%20Linux%20Progr...
http://ianzag.megasignal.com/ftp/pub/doc/books/Linux/Interprocess%20Communica...

естественно, что есть и другие.

// wbr

klalafuda ★☆☆
()
Ответ на: Re: а такой bt кому-нибуть что-нибуть говорит??? от klalafuda

Re: а такой bt кому-нибуть что-нибуть говорит???

>http://ianzag.megasignal.com/ftp/pub/doc/books/UNIX/Unix%20Systems%20Programm... >http://ianzag.megasignal.com/ftp/pub/doc/books/Linux/Advanced%20Linux%20Progr... >http://ianzag.megasignal.com/ftp/pub/doc/books/Linux/Interprocess%20Communica...

по всем трём ссылкам получаю 403 forbidden

>уважаемый cvv, я вас очень прошу - почитайте книги. после прочтения у вас отпадёт большая часть вопросов, которые вы задавали в этом форуме в течении последнего месяца. этим вы сэккономите массу времени и себе и окружающим вас людям.

книги я читал. и стивенса у меня дома оба тома и advanced linux programming. тем не менее обсуждение с некоторыми людьми приносит не меньше пользы особенно после того как что-то прочитал

например ты можеш сказать почему на мей машине игнорируется SA_RESTART для сигнала SIGCHLD???

cvv ★★★★★
() автор топика

Re: а такой bt кому-нибуть что-нибуть говорит???

> например ты можеш сказать почему на мей машине игнорируется SA_RESTART для сигнала SIGCHLD???

Для какого конкретно вызова игнорируется SA_RESTART для SIGCHLD?

Onanim
()

Re: а такой bt кому-нибуть что-нибуть говорит???

> по всем трём ссылкам получаю 403 forbidden

потому что ссылки битые (форум порезал?) :-/
ps: IMHO могли бы и догадаться зайти уровнем выше на http://ianzag.megasignal.com/ftp/pub/doc/books/ и найти желаемое. путь к просветлению не всегда самый прямой.

> книги я читал. и стивенса у меня дома оба тома и advanced linux programming. тем не менее обсуждение с некоторыми людьми приносит не меньше пользы особенно после того как что-то прочитал

бывает что и приносит. но AFAIR обсуждаемая проблема в нем более чем хорошо описана -> при внимательном чтении и вопроса бы не возникло.

> например ты можеш сказать почему на мей машине игнорируется SA_RESTART для сигнала SIGCHLD???

http://www.opengroup.org/onlinepubs/009695399/functions/sigaction.html

---cut---
SA_RESTART
[XSI] [Option Start] This flag affects the behavior of interruptible functions; that is, those specified to fail with errno set to [EINTR]. If set, and a function specified as interruptible is interrupted by this signal, the function shall restart and shall not fail with [EINTR] unless otherwise specified. If the flag is not set, interruptible functions interrupted by this signal shall fail with errno set to [EINTR]. [Option End]
---cut---

-> входных данных от вас мягко говоря недостаточно.

// wbr

klalafuda ★☆☆
()
Ответ на: Re: а такой bt кому-нибуть что-нибуть говорит??? от klalafuda

Re: а такой bt кому-нибуть что-нибуть говорит???

> входных данных от вас мягко говоря недостаточно.

эта проблема не раз на форуме обсуждалась и вводила в недоумение die-hard и ещё кое-кого.

суть траблы: делаю popen() а далее пытаюсь читать при помощи fread(). так вот sigchld пришедший при завершении дочернего процесса прерывает fread() c errno=EINTR несмотря на установленный SA_RESTART для sigchld.

die-hard и другие ситуацию воспроизвести не смогли.

cvv ★★★★★
() автор топика

Re: а такой bt кому-нибуть что-нибуть говорит???

> суть траблы: делаю popen() а далее пытаюсь читать при помощи fread(). так вот sigchld пришедший при завершении дочернего процесса прерывает fread() c errno=EINTR несмотря на установленный SA_RESTART для sigchld.

можно пример законченного кода в студию? собрал->запустил->проверил.

ps: да, я в состоянии написать его сам. нет, сам писать я не буду. нет, я не пользуюсь поиском по форуму.

// wbr

klalafuda ★☆☆
()

Re: а такой bt кому-нибуть что-нибуть говорит???

> суть траблы: делаю popen() а далее пытаюсь читать при помощи fread().
> так вот sigchld пришедший при завершении дочернего процесса прерывает
> fread() c errno=EINTR несмотря на установленный SA_RESTART для
sigchld.
>
> die-hard и другие ситуацию воспроизвести не смогли.

Что же это у тебя за система такая долбанутая? :-/
Ответь пожалуйста:
Что означает "прерывает fread()"?
Что при этом возвращает fread()?
Что сразу после этого говорят feof() и ferror() для этого потока?

Да, и запости плиз минимальную программу для демонстрации.
(если ты ее уже постил, плиз дай url на то сообщение)

Onanim
()

Re: а такой bt кому-нибуть что-нибуть говорит???

>Что же это у тебя за система такая долбанутая? :-/
slackware 9.1
>Что означает "прерывает fread()"?
буквально, fread завершается по сигналу а не по запонению буфера или концу файла

ситуация должна воспроизводится в следующем приложении

#include <unistd.h>                                                                                                            
#include <string.h>                                                                                                            
#include <syslog.h>                                                                                                            
#include <signal.h>                                                                                                            
#include <errno.h>                                                                                                             
#include <stdbool.h>                                                                                                           
                                                                                                                               
                                                                                                                               
//Ф-я помещающая первую строку вывода команды 'cmd' в возвращаемую строку                                                      
static char*out2var(char*cmd){                                                                                                        
  FILE*is;                                                                                                                     
  static char buf[OUT2_MAX_LINE_LEN];                                                                                          
  int j;                                                                                                                       
  //Запуск команды cmd                                                                                                         
  is=popen(cmd,"r");                                                                                                           
  if(is==NULL){                                                                                                                
    snprintf(buf,sizeof(buf),"error open pipe to '%s' : %s",cmd,strerror(errno));                                              
    syslog(LOG_ERR,buf);                                                                                                       
    return buf;                                                                                                                
  }                                                                                                                            
                                                                                                                               
  //вычитывание первой строки вывода                                                                                           
  bool cont=true;                                                                                                              
  for(j=0;(j<OUT2_MAX_LINE_LEN-1) && cont;){                                                                                   
    int ch=fgetc(is);                                                                                                          
    if(ch!=EOF && ch!= '\n'){                                                                                                  
        buf[j]=ch; j++;                                                                                                        
    }else{                                                                                                                     
        if (ferror(is)){                                                                                                       
                syslog(LOG_ERR,"error reading pipe to \"%s\" : %s",cmd,strerror(errno));                                       
            if(errno==EINTR){clearerr(is); continue;}                                                                          
            else{cont=false;}                                                                                                  
            }                                                                                                                  
        if(feof(is) || ch=='\n') {cont=false;};                                                                                
    }                                                                                                                          
  }                                                                                                                            
  //Добавление терминирующего нуля                                                                                             
  buf[j]='\0';                                                                                                                 
  //Завершение дочерней программы                                                                                              
  if(pclose(is)==-1){syslog(LOG_ERR,"error close pipe to \"%s\" : %s",cmd,strerror(errno));};                                  
                                                                                                                               
  return buf;                                                                                                                  
}                                                                                                                              

cvv ★★★★★
() автор топика

Re: а такой bt кому-нибуть что-нибуть говорит???

---cut---
snprintf(buf,sizeof(buf),"error open pipe to '%s': %s", cmd, strerror(errno));
syslog(LOG_ERR, buf);                                                                                                       
---cut---

это некорректно и рано или поздно даст железную корку.
вопрос: почему? :)

hint: http://www.opengroup.org/onlinepubs/009695399/functions/syslog.html

// wbr

klalafuda ★☆☆
()

Re: а такой bt кому-нибуть что-нибуть говорит???

> die-hard и другие ситуацию воспроизвести не смогли.

Я же персонально тебе тут отписАл пару недель назад!!!

http://www.linux.org.ru/view-message.jsp?msgid=1152778

Die-Hard ★★★★★
()

Re: а такой bt кому-нибуть что-нибуть говорит???

> http://www.linux.org.ru/view-message.jsp?msgid=1152778

Ну у тебя же там про семантику signal() vs sysv_signal().
А cvv использует sigaction(), в которой рестарт определяется
явно при помощи SA_RESTART.



Onanim
()

Re: а такой bt кому-нибуть что-нибуть говорит???

> Да, но он на меня ссылается! Я ж написАл, что был не прав!

Не обращай внимания... запутался я... cvv выдал за недолгое время
такой букет проблем, что я уже перестал их различать ;-)

2cvv: ничего личного, продолжай ;-) "Дорогу осилит идущий" (C)

Onanim
()

Re: а такой bt кому-нибуть что-нибуть говорит???

Onanim:

> cvv выдал за недолгое время такой букет проблем, что я уже перестал их различать ;-)

IMHO нормально, его проблемы не выходят за рамки типичных для данного форума. Я бы даже сказал, они, с некоторыми, может, поправками, в авангарде наиболее интересных проблем, тут обсуждаемых.

Die-Hard ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.