Macro-ul DIE

Macrou-ul DIE folosit în sursele din laborator e util pentru verificarea codului de eroare întors de un apel de sistem.

Exemplu de utilizare:

fd = open("some file", O_CREAT, 0644);
 
DIE(fd < 0, "invalid file descriptor");

Macro-ul DIE este definit în fișierul util/utils.h din arhiva laboratorului și arată în felul următor:

#include <errno.h>
#define DIE(assertion, call_description)				\
	do {								\
		if (assertion) {					\
			fprintf(stderr, "(%s, %d): ",			\
					__FILE__, __LINE__);		\
			perror(call_description);			\
			exit(errno);					\
		}							\
	} while (0)

Dezavantaje

Dacă verificarea specificată prin assertion eșuează, se afișează detalii despre eroare și se iese imediat din program, deci nu se eliberează resursele.

Altă abordare

O abordare mai profesionistă, dar un pic mai complexă, presupune folosirea intrucțiunii goto. Exemplu:

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
 
 
int main(void)
{
	int fd1, fd2;
 
	fd1 = open("file1", O_CREAT | O_RDWR, 0644);
	if (fd1 < 0) {
		perror("open file1 failed");
		goto exit_1;
	}
 
	fd2 = open("file2", O_CREAT | O_RDWR, 0644);
	if (fd2 < 0) {
		perror("open file2 failed");
		goto exit_2;
	}
 
/* ... rest of the code ...*/
 
	return 0;
 
exit_2:
	close(fd1);
 
exit_1:
	return -1;
}

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.

so/laboratoare/resurse/die.txt · Last modified: 2018/03/02 23:36 by mihai.popescu1212
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0