2011-08-30 21 views
5

Sto eseguendo il porting di un programma Windows su Linux. Il mio programma utilizza la gestione delle eccezioni strutturate di Windows (SEH). Linux non supporta la gestione strutturata delle eccezioni, tuttavia fornisce la gestione dei segnali. Possiamo sovrascrivere il segnale per sviluppare il paradigma SEH.Gestione delle eccezioni in linux

Una volta che siete in grado di filtrare l'eccezione di Windows offre tre alternative flussi di controllo dell'esecuzione:

1) EXCEPTION_EXECUTE_HANDLER: Esegui gestore 2) EXCEPTION_CONTINUE_SEARCH: Inoltrare l'eccezione di blocco successivo (se non esiste, allora a OS) 3) EXCEPTION_CONTINUE_EXECUTION: continua l'eccezione dall'istruzione in cui si è verificato l'interruzione.

Come posso ottenere questo flusso di controllo in Linux. In Linux, una volta gestito il segnale, il programma avvia l'esecuzione da dove è stato interrotto. Come sviluppare i paradigmi continue_search e execute_handler?

Grazie in anticipo

risposta

5

Non v'è alcun modo semplice per fare ciò che si vuole qui in C++. I tuoi strumenti sono il meccanismo di eccezione C++ standard e sigaction. Un gestore sigaction può restituire il controllo nel punto in cui era stato interrotto. Può lanciare, anche se ci sono state controversie sulla sicurezza di questo. Alcuni direbbero che deve impostare una variabile atomica e ritornare. (Il problema è che il compilatore non vede possibilità di lancio e quindi non si prepara per questo.)

Se stai lavorando in C, hai opzioni complesse aggiuntive che includono sigsetjmp, che è più o meno goto su steroidi , rischi e tutto.

Dato che non hai specificato una lingua o quale condizione eccezionale stai cercando di affrontare, non è pratico offrire una ricetta più specifica.

+0

Grazie per la risposta. – Utkarsh

+0

Sto usando il linguaggio C++. Potrebbe essere necessario estrarre questa funzionalità e creare un file oggetto condiviso. Ho anche paura di poter supportare la gestione dei segnali all'interno della libreria condivisa. Inoltre, cosa succede se lo sviluppatore dell'applicazione ha la precedenza sul segnale con qualche altro gestore. – Utkarsh

+0

Ho letto la sigaction. Come hai descritto, restituisce il controllo nel punto in cui era stato interrotto. Ma, ho anche bisogno di saltare/eseguire un particolare codice bypassando il flusso esistente (esegui il blocco catch e continua la ricerca nei blocchi sopra). Non sei sicuro di come ottenere questa funzionalità. – Utkarsh