C & C++/C

[C] _GNU_SOURCE 사용

Razelo 2026. 1. 12. 23:09

 

strerrorname_np를 통해서 errno를 EPERM 같은 값으로 출력할 수 있도록 코드를 짰는데, 

계속 컴파일러가 strerrorname_np의 리턴값이 int라고 추론했다. 

따라서 최상단에 _GNU_SOURCE를 붙여주었고, gcc임을 명시해주는 방식으로 해결할 수 있었다. 

 

 

#define _GNU_SOURCE 

#include<sys/epoll.h>
#include<stdio.h>
#include<errno.h>
#include<unistd.h>
#include<fcntl.h>
#include<string.h>


int main() {
	const char* filename = "buccaneer.txt"; 
	int fd = open(filename, O_RDWR); 
	if (fd == -1) {
		perror("open");
		return 1; 
	}

	struct epoll_event event; 
	int ret; 
	int epfd; 
	epfd = epoll_create1(0);
	if (epfd == -1) {
		perror("epoll_create1");
		return 1; 
	}
	
	event.data.fd = fd;
       	event.events = EPOLLIN | EPOLLOUT; 
	ret = epoll_ctl(epfd, EPOLL_CTL_ADD, fd, &event);
	if (ret == -1){
		printf("strerror: %s, code: %s\n", strerror(errno), strerrorname_np(errno)); 
		perror("epoll_ctl");
		return 1; 
	}

	event.events = EPOLLIN;
	ret = epoll_ctl(epfd, EPOLL_CTL_MOD, fd, &event);
	if (ret == -1) {
		perror("epoll_ctl");
		return 1; 
	}

	ret = epoll_ctl(epfd, EPOLL_CTL_DEL, fd, &event);
	if (ret == -1){
		perror("epoll_ctl");
		return 1; 
	}

	if(close(fd)) {
		perror("close");
		return 1; 
	} 
	return 0; 
}