[Linux] Spåra sändare av unix-signal

Permalänk
Medlem

[Linux] Spåra sändare av unix-signal

Hej,

Har ett program som får en EINTR av okänd anledning när den kör semop().

Har kommit på hur man kan få ut vilken signal som programmet fått genom att lägga in signal-handlers.

Men min fråga är om man kan spåra från vilket program (pid) denna signal skickades från i vårt program?

Någon som vet?

Miljön som vi kör i är Redhat RHEL5.

Permalänk
Medlem

Låter som det kommer från kärnan i det här fallet, så jag skulle nog inte lägga alltför mycket tid på det där. Det går att göra, men jag kan inte hur (du kan kolla på ptrace, har för mig att den kan användas på något sätt) och jag misstänker att det är mer krångel än vad det är värt för ett enstaka fel om du inte har uteslutit allt annat. När det gäller systemanrop som man får signaler ifrån så brukar jag vanligtvis anta att anropet är använt felaktigt. Svårt att säga varför, dels för att du inte har någon kod alls, men även med kod så är jag inte speciellt insatt i semaforhantering i UNIX. Någon annan här kan kanske mer.

Permalänk
Medlem

Iom. att du nämnde att du kommit på att du kan fånga signaler via signal-handlers så antar jag att detta är ett program som du har källkoden till och kompilerar själv, snarare än att du bara har en binär som du felsökt med en debugger. Om du bara har binär hjälper nog följande inte särskilt mycket, utan då får du nog kanske göra nått i stil med vad Thomas_H föreslog.

Fånga signaler med sigaction (istället för bara signal() om du gör så nu). Dina signal-hanterande funktioner kommer att anropas med bla. en siginfo_t, som har en medlem si_code, om si_code <=0, kommer medlemmarna si_pid och si_uid vara satta till pid resp. uid för den process som skickade signalen.

Om signalen inte kommer från någon annan process (utan ifrån kärnan) så kommer si_code vara >0, och då får du bara kolla vad koden betyder, ex. på:
siginfo_t -- data structure containing signal information

Den första koden för varje signal på den sidan har värdet 1, den andra koden har värdet 2 osv. (så ex. skulle si_code=2 för signal=SIGSEGV vara SEGV_ACCERR).

Inte testat detta tidigare, har bara läst mansidan för sigaction och filen siginfo.h, så jag reserverar mig för felaktigheter

Visa signatur

The difference between stupidity and genius - the latter has limits

Permalänk
Medlem

Allright, det låter ju lovande Zevon, glömde iförsig att säga att det är i ett perlscript som denna okända signal kommer till...

Jag får kolla runt om det finns någon perl-wrapper runt sigaction, annars får jag hacka ihop något. Detta kanske någon oxå vet eller?

Tusen tack.