IT/Linux C
-
library linkingIT/Linux C 2013. 7. 27.
linux librarylinux는 windows와 달리, 시스템에서 동일 library의 여러 버전을 가지고 있는 것을 권장하지 않는다. 그래서 yum 또는 apt같은 패키지 배포에서는 library 의존성에 맞게 설치하게 되어 있다. 배포판 관리입장에서는 정교하게 library와 프로그램을 지원해주는 일을 하고 있고, 호환성을 위해 바로 이전 버전의 library를 함께 설치가능하게 지원>하는 등의 배려는 하고 있다. library force link 그런일이 일어나지 않아야 하지만, 제품의 호환성과 준비 시간의 문제로 하나의 시스템에 여러 library 버전을 설치해야 하는 경우도 있다. 여기서 문제는 동일 library의 다른 버전으로 두 개 설치되었다고 해서 우리가 원하는 버전을 참조하지 않을 ..
-
self extracting archiveIT/Linux C 2013. 7. 7.
Self Extracting Archive일반적으로 linux에서 프로그램들은 각 배포판에 따라 rpm 또는 deb 과 같이 정해진 패키지 단위로 프로그램을 설치/삭제하지만, self extracting을 통해서 패키징 절차 없이 파일 하나로 프로그램이 설치가 되도록 할 수 있다. self extracting archive는 말 그대로 스스로 압축된 파일을 풀리게 만드는 것인데, 배포판 패키징 절차 없이 프로그램에 필요한 파일(binary 및 conf, ....)들을 하나의 script 파일 하나로 배포할 수 있는 장점이 있다. 관리를 고려할 때, 당연히 linux 배포판의 패키징 절차를 따라야 하겠지만 "스크립트만으로 이런 것도 가능하다"라는 입장에서 한번 살펴볼만 하다.참고: http://en.wik..
-
glibc detected double free or corruptionIT/Linux C 2013. 6. 1.
double free or corruption 오류 중 쉽다고 생각했던 double free or corruption 문제의 원인을 찾는데 엄청난 시간이 걸림을 경험하고 나니, 다른 분들도 이런 경우를 고려해 봤으면 하는 바람에서 >글을 적는다. double free or corruption 오류는 메모리 오류로써 두가지 발생 케이스가 있다.passing the same address to free twice overrunning an allocated area before passing its address to free. 1번과 2번 모두 free라는 메모리 해제 시스템함수를 호출할 때 segfault가 발생합니다.이런 문제를 만나면 일단 free가 두 번되는 경우가 있는지를 빠르게 찾고, 그 다음부..
-
System call과 glibcIT/Linux C 2013. 2. 24.
System call이란?자, 일단 System call이란 사용자 공간(User Space)에서 시스템(Kernel)에게 필요한 기능을 직접 요청하는 것으로 프로세스 또는 디스크 I/O, 메모리 요청등 종류도 다양하다. 리눅스에서 사용자 공간에 제공되는 System call들은 다양한 아키텍쳐(i386, powerPC,..)등을 지원하며 약 300여개 정도 명령들을 지원한다. ex) 리눅스 커널에서 x86 시스템에 대한 System call Table(arch/x86/kernel/syscall_table_32.S)ENTRY(sys_call_table) .long sys_restart_syscall /* 0 - old "setup()" system call, used for restarting */ .l..
-
int type을 bool type으로 활용하는 방안IT/Linux C 2013. 1. 18.
C언에서 !을 사용하게 되면, 0이 아닌 숫자의 경우에 대해서 0으로 변경하고 0인 경우에는 1로 값을 변화시켜준다. !을 한번만 사용하게 되면 자연스럽게 0 or 1의 값을 갖게 되고 !!을 하게 되면 최초 0일 경우에는 0으로 그리고 0이 아닌 값인 경우에는 1로 값이 변환되게 된다. 즉, bool type처럼 0 or 1의 값으로 활용 가능하다. int i = 12345; printf("%d\n", !i); printf("%d\n", !!i); 출력01 위의 내용들이 사실 필요할까 싶지만 다음의 linux kernel에서의 일부 코드를 살펴보면, static int ethtool_get_one_feature(struct net_device *dev, char __user *useraddr, u32 ..
-
C언어, enum 타입의 크기는?IT/Linux C 2012. 12. 19.
enum 타입으로 정의된 리스트를 정리하고 있다가, 최대치가 궁금해서 간단한 확인을 해보았다. 변수들은 일반적으로 sizeof를 이용하여 크기를 알아 낼 수 있는데, sizeof(enum)이 안되기 때문에, struct로 enum 타입을 감싸고 sizeof로 크기를 확인해보았다. linux 64bit 그리고 gcc 컴파일러를 사용하였다. #include enum enum_number { ONE, TWO, THREE }; struct enum_struct { enum enum_number num; }; int main(int argc, char* argv[]) { printf("enum:%ld\n",sizeof(struct enum_struct)); return 0; } enum:4 4byte 크기면, e..
-
표준입출력과 버퍼링IT/Linux C 2012. 4. 18.
시스템은 기본입출력인 stdin,stdout, stderr가 있다. stdin과 stdout은 해당 내용이 즉시 반영되지 않고 버퍼(linux에서는 4k)에 저장되었다가, 조건에 의해서 read 혹은 write한다. 얼마전에 stdout buffer 때문에 프로그램이 의도치 않게 행동하여 애를 먹은적이 있다. FILE *fp = fopen("test.log","w"); for( int i=0; i < 10; i++) { fprintf(fp,"1"); sleep(1); } fclose(fp); 코드의 의도는 test.log라는 file에 "1"을 1초씩 쉬면서 10번 쓰는겁니다. 하지만 write의 내용은 버퍼링 되기 때문에, 바로 적히지 않고 10초 뒤에 한번에 10번 쓰여진다. 파일이 닫힐 때 버퍼를 ..
-
global variable multiple definition of ...IT/Linux C 2012. 2. 6.
코드 수정 작업을 하다가 제목과 같은 global variable multiple definition of ... 컴파일 오류를 만날 때가 있다. 말 그대로 전역변수가 다중으로 선언되었다라는 의미인데, 분명 코드 작성자는 의도적으로 저렇게 작성하지 않았을텐데 저 문장을 만나게 되면 골치가 아파진다. 모듈화된 코드를 만들고 있다라고 가정했을 때, 다음과 같은 순서로 진행할 수 있다. 1) 헤더파일에 자료구조와 함수들의 선언부를 작성하였다. 2) 헤더파일에 자료구조의 전역 변수를 선언하였다. 3) 코드파일에 함수 구현부를 작성하였다. 위와 같이 진행할 경우, 결과적으로 2번 때문에 global variable multiple definition of ... 컴파일 오류를 만날 가능성이 엄청나게 올라간다. 이..