cermo-lit.ru

  

Bästa artiklarna:

  
Main / Sigtrap signal i unix vad som är

Sigtrap signal i unix vad är

Den gemensamma kommunikationskanalen mellan användarutrymme och kärna ges av systemanropen. Men det finns en annan kanal, signalerna, som används både mellan användarprocesser och från kärna till användarprocess. Detta kommer att skicka signalen med nummer sig till processen med process-ID pid. Signaltal är små positiva heltal. Observera att dessa definitioner beror på operativsystem och arkitektur. En användare kan skicka en signal från kommandoraden med dödkommandot.

Vanliga användningsområden är kill -9 N för att döda processen med pid N, eller kill -1 N för att tvinga process N, kanske init eller inetd för att läsa om dess konfigurationsfil. Vissa användaråtgärder kommer att få kärnan att skicka en signal till en process eller grupp av processer: Vissa programåtgärder gör att kärnan skickar en signal till den processen: Mer intressant kommunikation från kärnan är också möjlig.

Man kan be kärnan att meddelas när något händer i en given filbeskrivare. Se fcntl 2. Och sedan finns det ptrace 2 - se nedan. När en process tar emot en signal sker en standardåtgärd, såvida inte processen har ordnat att hantera signalen. För lista över signaler och motsvarande standardåtgärder, se signal 7. Returvärdet är adressen till den gamla hanteraren. När en signal kommer avbryts processen, de aktuella registren sparas och signalhanteraren anropas.

När signalhanteraren återvänder fortsätter den avbrutna aktiviteten. Det är svårt att göra intressanta saker i en signalhanterare, eftersom processen kan avbrytas på ett godtyckligt ställe, datastrukturer kan vara i godtyckligt tillstånd, etc. De tre vanligaste sakerna att göra i en signalhanterare är jag ställer in en flaggvariabel och återvänd omedelbart, och ii rörigt kasta bort allt programmet som gjordes, och starta om vid någon lämplig punkt, kanske huvudkommandoslingan eller så, och iii städa upp och avsluta.

Att ställa in en hanterare för en signal kallas "fånga signalen". Den traditionella semantiken var: Möjligen gjordes detta för att undvika rekursiva anrop. Signalhanteraren skulle göra sitt jobb och vid slutet ringa signalen för att etablera sig igen som hanterare. Detta är verkligen olyckligt. När två signaler anländer strax efter varandra kommer den andra att gå förlorad om den anländer innan signalhanteraren anropas - det finns ingen räknare. Och om den anländer efter att signalhanteraren har anropats, kommer standardåtgärden att hända - detta kan mycket väl döda processen.

Även om hanteraren anropar signal igen som det allra första det gör, kan det vara för sent. Olika Unix-smaker spelade lite med semantiken för att förbättra den här situationen. Vissa blockerar signaler så länge processen inte har återvänt från hanteraren. BSD-lösningen var att uppfinna ett nytt systemanrop, sigaction där man exakt kan ange önskat beteende.

Dagens signal måste betraktas som utfasad - inte användas i seriösa applikationer. Varje process har en lista bitmask med för närvarande blockerade signaler. När en signal blockeras levereras den inte, det vill säga ingen signalhanteringsrutin anropas, men förblir i väntan. Systemprovet för sigprocmask tjänar till att ändra listan över blockerade signaler. Se sigprocmask 2. Sigsuspend-systemanropet avbryter anropsprocessen tills en specificerad signal tas emot.

När en process skjuter bort ett barn för att utföra någon uppgift är det förmodligen intresserat av hur saker och ting gick. Vid utgång lämnar barnet en utgångsstatus som ska returneras till föräldern. Så när barnet är klart blir det en zombie - en process som redan är död men inte försvinner ännu eftersom den ännu inte har rapporterat sin utgångsstatus. När något intressant händer med barnet det går ut, kraschar, fälls, stannar, fortsätter, och i synnerhet när det dör skickas föräldern en SIGCHLD-signal.

Föräldern kan använda systemets samtal vänta eller vänta eller så, det finns några variationer för att lära sig om statusen för sina stoppade eller avlidna barn. När det gäller ett avlidet barn försvinner zombien så snart en status har rapporterats. I den här situationen, om föräldern väntar, återkommer det här samtalet när alla barn har gått ut och returnerar sedan -1 med errno inställt på ECHILD. Efter handling. Om föräldern går ut före barnet får barnet rätt till init, process 1, och denna process kommer att skörda sin status.

När programmet avbröts av en signal sparades dess status inklusive alla hel- och flytpunktsregister, som skulle återställas precis innan körningen fortsätter vid avbrottspunkten. Detta innebär att retur från signalhanteraren är mer komplicerad än en godtycklig procedurretur - det sparade tillståndet måste återställas. För detta ändamål ordnar kärnan att retur från signalhanteraren orsakar ett hopp till en kort kodsekvens som ibland kallas trampolin som utför ett sigreturn-systemanrop.

Detta systemanrop tar hand om allt. I gamla dagar levde studsmattan på stacken, men nuförtiden sedan 2. För felsökningsändamål infördes ptrace-systemanropet.

En process kan spåra en annan process, undersöka eller ändra minne, se systemanrop eller ändra dem osv. Sättet på detta implementeras är att spårningsprocessen meddelas varje gång den spårade processen gör något intressant.

Alltid intressant är mottagning av signaler. När spårningsprocessen specificerar detta är också undantag från systemanrop eller utförande av instruktioner intressant. Man har alltså interaktiva debuggare som gdb och spårare som strace. Det här samtalet är också mycket användbart för hackningssyfte. Man kan göra sitt eget program kopplat till något verktyg och subtilt ändra dess funktion, medan det binära i verktyget är oförändrat, har fortfarande rätt datumstämplar och md5sum.

Övning Skriv ett program som fäster sig vid en process med angiven pid och tittar på dess lästa samtal; varje gång en angiven sträng uppstår, ändra den till något annat.

Var annars osynlig. Övning Skriv ett program som fäster sig vid ett skal och tittar på kommandona. När en specificerad binär måste köras, kör en annan specificerad binär istället. Nedan ett babyexempel på användning av ptrace.

Detta program visar systemanrop som gjorts av vissa befintliga processsamtal. Versionen nedan fungerar bara på i386, och endast för relativt nya kärnor. Det ger en signal som processen ska få när dess förälder dör.

Denna konstruktion kan användas i trådbibliotek:

(с) 2019 cermo-lit.ru