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