This shows you the differences between two versions of the page.
|
so:laboratoare:resurse:die [2013/01/31 21:57] 127.0.0.1 external edit |
so:laboratoare:resurse:die [2018/03/02 23:36] (current) mihai.popescu1212 [Macro-ul DIE] |
||
|---|---|---|---|
| Line 13: | Line 13: | ||
| Macro-ul DIE este definit în fișierul ''util/utils.h'' din arhiva laboratorului și arată în felul următor: | Macro-ul DIE este definit în fișierul ''util/utils.h'' din arhiva laboratorului și arată în felul următor: | ||
| - | <code> | + | <code c> |
| + | #include <errno.h> | ||
| #define DIE(assertion, call_description) \ | #define DIE(assertion, call_description) \ | ||
| do { \ | do { \ | ||
| Line 20: | Line 21: | ||
| __FILE__, __LINE__); \ | __FILE__, __LINE__); \ | ||
| perror(call_description); \ | perror(call_description); \ | ||
| - | exit(EXIT_FAILURE); \ | + | exit(errno); \ |
| } \ | } \ | ||
| - | } while(0) | + | } while (0) |
| - | + | ||
| - | #endif | + | |
| </code> | </code> | ||
| Line 31: | Line 30: | ||
| Dacă verificarea specificată prin ''assertion'' eșuează, se afișează detalii despre eroare și se iese imediat din program, deci **nu se eliberează resursele**. | Dacă verificarea specificată prin ''assertion'' eșuează, se afișează detalii despre eroare și se iese imediat din program, deci **nu se eliberează resursele**. | ||
| - | ==== Alternativă ==== | + | ==== Altă abordare ==== |
| O abordare mai profesionistă, dar un pic mai complexă, presupune folosirea intrucțiunii **goto**. | O abordare mai profesionistă, dar un pic mai complexă, presupune folosirea intrucțiunii **goto**. | ||
| Line 47: | Line 46: | ||
| int main(void) | int main(void) | ||
| { | { | ||
| - | int fd1, fd2; | + | int fd1, fd2; |
| - | fd1 = open("file1", O_CREAT | O_RDWR, 0644); | + | fd1 = open("file1", O_CREAT | O_RDWR, 0644); |
| - | if (fd1 < 0) { | + | if (fd1 < 0) { |
| - | perror("open file1 failed"); | + | perror("open file1 failed"); |
| - | goto exit_1; | + | goto exit_1; |
| - | } | + | } |
| - | fd2 = open("file2", O_CREAT | O_RDWR, 0644); | + | fd2 = open("file2", O_CREAT | O_RDWR, 0644); |
| - | if (fd2 < 0) { | + | if (fd2 < 0) { |
| - | perror("open file2 failed"); | + | perror("open file2 failed"); |
| - | goto exit_2; | + | goto exit_2; |
| - | } | + | } |
| /* ... rest of the code ...*/ | /* ... rest of the code ...*/ | ||
| - | return 0; | + | return 0; |
| exit_2: | exit_2: | ||
| - | close(fd1); | + | close(fd1); |
| exit_1: | exit_1: | ||
| - | return -1; | + | return -1; |
| } | } | ||
| - | </code> | + | </code> |
| + | |||
| + | ==== Concluzie === | ||
| + | Pentru că aplicațiile din laborator și teme urmăresc în primul rând formarea deprinderii de a verifica **mereu** codul de eroare întors de apelurile de sistem, puteți folosi macro-ul DIE în rezolvarea task-urilor din laborator. | ||
| - | ==== Concluzie === | ||
| - | Pentru că aplicațiile din laborator urmăresc în primul rând formarea deprinderii de a verifica **mereu** codul de eroare întors de apelurile de sistem, puteți folosi macro-ul DIE în rezolvarea task-urilor din laborator. | ||