리눅스2012. 3. 2. 11:05

가끔 일하다보면 다른사람에게 리눅스 배포판 하고 버젼을 알려줘야 할 때가 있다.  그런데 뭐더라??? 할 때가 있는데, 이럴 땐 당황하지 말고, 다음과 같이 하자.


$ cat /etc/*-release


그러면 우분투의 경우,

배포판 아이디,  배포판 릴리즈버젼,  배포판  코드네임, 배포판 설명 등을 보여준다.

참 쉽죠? 

Posted by code cat
프로그래밍/C2012. 2. 29. 11:10

출처: http://www.mkssoftware.com/docs/man3/exit.3.asp


exit() 함수는 atexit() 함수로 등록된 모든 함수들을 역순서로 호출한다.  


그 후, exit()는 데이터가 남겨있는 버퍼를 가진 모든 오픈 스트림을 비우고, 닫는다(모든 오픈 스트림에 fclose()를 하는 것과 유사하다).  마지막으로 exit()_exit(status)를 호출하여 호스트 환경으로 제어를 넘겨준다.


만약 exit(0) 혹은 exit(EXIT_SUCCESS)라면,  exit()는 임플리멘테이션에 정의된 성공적인 상태의 마침을 반환하며

만약 exit(EXIT_FAILURE)라면, exit()는 임플리멘테이션에 정의된 실패상태의 마침을 반환한다.  


마지막으로 이식성을 위해,


exit(0), exit(1)     대신 

exit(EXIT_SUCCESS), exit(EXIT_FAILURE)


를 사용하자.

'프로그래밍 > C' 카테고리의 다른 글

sprintf 사용법  (0) 2012.04.03
sscanf 사용법  (0) 2012.03.28
file에서 읽어와 strtok을 이용해 struct에 저장하기  (2) 2012.02.28
C의 역사  (0) 2012.02.19
enum vs #define vs const  (0) 2012.02.05
Posted by code cat
프로그래밍/C2012. 2. 28. 17:32

다음과 같이 작성하면 간단하게 구현할 수 있다. main은 생략했다.


struct안의 char는 char*형을 쓰면 오동작을 한다.

'프로그래밍 > C' 카테고리의 다른 글

sscanf 사용법  (0) 2012.03.28
exit(1) vs exit(EXIT_FAILURE)  (0) 2012.02.29
C의 역사  (0) 2012.02.19
enum vs #define vs const  (0) 2012.02.05
enum 타입 c vs c++  (0) 2012.02.04
Posted by code cat
리눅스2012. 2. 24. 13:26

머 이리 많냐!!! 싶겠지만, 알고나면 별거 아니다.


/bin

/usr 같은 큰 파티션이 마운트 되기 전에 / 에 위치해야 할 작은 프로그램 전용. 대표적인 예로, /bin/sh이 있겠다.


/sbin

/bin과 같이 /usr같은 큰 파티션이 마운트 되기전에 필요한 것은 동일하지만, /bin과 달리 시스템 관리 프로그램들이 주로 상주한다.


/usr/bin

배포판에서 관리하는 보통의 유저 프로그램이 위치한다.


/usr/sbin

배폰판에서 관리하는 시스템 관리 프로그램들이 위치한다.


/usr/local/bin

배포판 패키지 관리자가 관리하지 않는 보통의 유저 프로그램(예: 로컬에서 컴파일한 패키지들)이 위치한다.


/usr/local/sbin

배도판 패키지 관리자가 관리하지 않는 시스템 관리 프로그램이 위치한다.


/opt

참조: http://codecat.tistory.com/entry/opt


마지막으로, 만일 같은 이름이 프로그램이 여기저기 있다면 어디 먼저 실행이 될까?

그건

echo $PATH

로 $PATH를 찍어보면 제일 먼저 나오는 경로 순으로 찾아서 실행이 된다.



'리눅스' 카테고리의 다른 글

GOT (Global Offset Table)  (0) 2012.03.02
리눅스 배포판 이름 버젼 알아내기  (0) 2012.03.02
Linux: umask  (0) 2012.01.03
JBD error message "barrier-based sync failed"  (0) 2011.08.17
EXT4 파일 시스템 굽기  (0) 2011.08.02
Posted by code cat

adduser 유저이름


으로 추가하면 된다.

이름, 전화번호 이런걸 물어보는데, 적당히 적어주고 마지막에 입력한 정보가 맞냐고 할 때 Y를 눌러주고 나오면 된다.

잘 만들어졌는지 확인하기 위해, /home/유저이름 으로 된 디렉터리가 생겼는지 확인해 보면 된다.

Posted by code cat
리눅스/커널2012. 2. 23. 00:43

출처: http://www.ibm.com/developerworks/linux/library/l-gcc-hacks/


GCC 확장(?)의 하나로서, GCC는 변수에 대한 참조를 통해서 타입을 확인할 수 있다. 이런 방법을 흔히 'generic programming'이라고 부르며 비슷한 기능을 제공하는 것을 현재 쓰이는 언어들에서 찾아 볼 수 있다.[1]
Linux의 경우, typeof를 사용하여 타입 종속적인 작업, (예를 들어 min/max 를 구별)을 할 수 있다.

간단한 예를 들어보자.(/linux/include/linux/kernel.h)

보이는 바와 같이 _min1은 x가 어떤 타입이냐에 따라서 그 타입을 가지게 된다; _min2 역시 y에 따라 타입이 달라진다. 이렇게 타입을 가지게 되므로 크기를 비교할 수 있게 되며, 어떠한 타입이 들어와도 대응할 수 있게 된다.

[1] 제네릭 프로그래밍(Generic programming)은 데이터 형식에 의존하지 않고, 하나의 값이 여러 다른 데이터 타입들을 가질 수 있는 기술에 중점을 두어 재사용성을 높일 수 있는 프로그래밍 방식이다

'리눅스 > 커널' 카테고리의 다른 글

리눅스 커널 분석 시 아키텍쳐별 tag 및 cscope생성  (0) 2012.04.16
Virtual Linux Manager 정리 1  (0) 2012.03.18
Documentation/arm/booting  (0) 2011.09.25
Linux 3.0 Kernel  (0) 2011.07.31
커널선점  (0) 2011.05.01
Posted by code cat
카테고리 없음2012. 2. 21. 17:00

putty로 접속하는 환경에서 byobu에서 한글 설정하기

~ 디렉터리에서

cd .byobu

vi profile (profile은 /usr/share/byobu/profiles/common을 가리킨다)

defutf8 on을 주석처리 해주면 된다.


간혹 /usr/share/byobu/profiles/common쪽에 권한이 없는 경우, ~ 디렉터리로 복사해 온 후, profile 링크를 다시 설정해 주면 된다.


Posted by code cat
프로그래밍2012. 2. 20. 16:23
출처:

[1] http://en.wikipedia.org/wiki/Thread-local_storage

[2] http://november11.tistory.com/entry/TLSThread-Local-Storage

[4] http://gcc.gnu.org/onlinedocs/gcc-3.3.1/gcc/Thread-Local.html

[3] http://sian999.egloos.com/3945779


TLS는 static혹은 global 메모리를 쓰레드에 지역적으로 쓸 수 있게 하는 프로그래밍 메소드다.

쓰레드는 일반적으로 같은 프로세스 안에서 같은 주소 공간(address space)를 사용하기 마련인데, 가끔은 이런걸 원치 않을 때가 있다.  같은 주소 공간을 사용한다는 뜻은 곧 같은 프로세스안의 쓰레드들이 접근할 때, 정적 혹은 전역 변수들이 같은 메모리 location에 있다는 말이다  이와 반대로, 스택에 있는 변수들은 각 쓰레드들에게 지역적(local)이다.(쓰레드는 각각의 스택을 지니고 있으므로 당연하다)

예를 들어, 두개 이상의 쓰레드가, 같은 정적 혹은 전역 변수를 접근할 때, 실제로는 다른 메모리 location을 접근하도록 하고 싶을 때가 있을 것이다.(즉 정적/전역변수를 로컬화 한다는 소리) 이런한 경우의 클래식 적인 예가 errno가 되겠다.


TLS를 사용하는 방법에는 2가지가 있는데, 

  1. 한가지는 정적으로 compiler 타임에 사용하는 것이고,

  2. 다른 하나는 동적으로 API를 사용하는 것이다.


우선 정적인 경우를 보자.

[3]비쥬얼 C++ 컴파일러 기준으로는 저장소 선언 지정자 __declspen(thread)를 사용한다.  이렇게 해서 변수를 정의하면, 컴파일러가 변수를 .tls라는 이름을 갖는 바이너리 파일의 데이터 영역에 변수를 넣도록 지시한다.  링커는 오브젝트 파일에 있는 모든 .tls 파일을 묶어서 exe나 dll바이너리 안의 .tls 섹션에 위치시킨다.

그러면 운영체제는 바이너리 실행파일이나 dll를 로드할 때, .tls영역에 대해서 주 스레드의 영역에 있는 모든 변수를 담을 수 있을만한 별도의 메모리를 할당하고, 각각의 스레드가 자신을 위해서 특별히 할당된 데이터 블럭만을 접근하도록 보장한다.

문제가 있다면 이렇게 정적으로 할당된 경우, 프로그램이 처음 로드될 때 운영체제가 .tls 메모리 블럭의 크기를 결정해야 한다.  exe파일에 정의된 정적 tls변수와 제한적으로 링크된 dll의 경우 잘 동작하나 loadlibray를 사용해서 로드된 dll은 .tls메모리 블록의 크기를 알기 어려우며, 처음에 생성할때 정해진 tls영역의 크기를 확장할 수 없다.  그래서 애플리케이션에서만 정적 스레드 로컬 저장소를 사용해야 하고 라이브러리는 동적 스레드 로컬 저장소 API를 사용해야만 한다.


[4]GCC의 경우 우선 compiler를 사용하는 방법에는 linker(ld), dynamic linker(ld.so), system libraries(libc.so & libpthread.so)들의 support가 필요하다.

유저 레벨에서의 확장은 __thread라는  새로운 기억 클래스 부류를 사용한다.

예를 들어,

__thread int i;

extern __thread struct state s;

static __thread char *p;

처럼 선언 할수 있다.

__thread는 어떠한 전역변수, 파일스코프 정적, 정적변수 에게나 적용할 수 있으나, 블록 한정 automatic 혹은 non-static 데이터 멤버에게는 적용 할 수 없다.


실제로 위의 코드를 첨가해서 파일을 만든 뒤 readelf -S 로 읽어보면, 

.tbass

.tdata

라는 섹션이 생김을 확인 할 수 있다.


arm 컴파일러에서는 RVCT 3.0에서 TLS를 지원한다고 나와있으며, __declspec(thread)과 __thread라는 2개의 키워드를 지원한다.

이제 동적인 경우를 보자.

MSDN에 따르면, TLS를 구현하기 위한 단계는 다음과 같다.

  1. 프로세스나 dll 초기화 때 TLS 인덱스를 할당하기 위해서 TlsAlloc함수를 사용하라.
  2. TLS인덱스를 사용할 필요가 있는 각 쓰레드를 위해 동적 메모리를 할당하고, TlsSetValue를 사용해서 TLS 인덱스와 방금 할당한 메모리를 연결하라
  3. 쓰레드가 그 자신의 메모리를 접근해야 할 때, TlsGetValue함수를 사용해서 TLS인덱스를 지정해 그 메모리의 포인터를 얻어라
  4. TLS인덱스와 연결된 동적 메모리를 더 이상 사용할 필요가 없을때는 반드시 해제하라.  TLS 인덱스를 사용하는 모든 쓰레다가 종료되면, TlsFree함수를 사용하여 TLS인덱스를 해제하라.








Posted by code cat
프로그래밍/C2012. 2. 19. 14:28
출처: secure coding in c and c++

C언어의 아버지 데니스 리치는 The Second History of Programming Language 컨퍼런스에서 C언어의 개발을 발표하였고, 1970년 초반  UNIX 오퍼레이팅 시스템에서의 시스템 구현 언어로서의 역활을 하기 위해 만들어 졌다.  C는 typeless 언어 B에서 파생되었으며, B언어 또한 BCPL이라는 언어에서 파생되었다.  BCPL은 1960 년대 마틴 리차드가 설계했으며 1920년 초반 여러 프로젝트에서 사용되었다. B는 type이 없는 C, 혹은 더 정확하게 말하자면, 메모리에 8K 바이트로 압축된 BCPL이라고 할 수 있겠다.


그 후,  1978년에 "K&R"이라고 자주 불리우는 'The C Programming Language'이  출판되었다.  이 시점의 C언어에 있었던 많은 변화들은 interdata 8/32라는 컴퓨터로 코드를 포팅하는 과정에서 생겨났으며 이 당시 C는 여전히 typeless라는 성격을 강하게 지니고 있었다.  


1983년 ANSI는 X3J11위원회를 설립했다. ANSI의 목표[ANSI 89]는 "명확하고, 일관되었으며, 모호하지 않는 C의 스탠다드를 만들어 C언어 환경안에서 사용자 프로그램의 portability 를 지원하고, 일반적인, 기존에 이미 존재하는 C의 정의를 코드화"하는 것이었다.  1989 년 말에 X3J11은 [ANSI 89]라는 리포트를 만들어 냈으며 이는 이후 ISO / IEC 9899-1990로 ISO에 의해 승인되었다.   물론, ANSI 표준의 섹션의 재배치가 있었고 ISO표준에서는 조항이 되었다고 하나 이 둘 사이의 기술적인 차이는 없다.  이 표준은 두 형태로, 일반적으로 C89와 같은, 또는 간혹 C90로 알려져 있다.


이 스탠다드는 우리가 흔히 아는 C89가 되었다.(혹은 승인 기준으로 C90이라고 불리우기도 한다.)  

후일 이 스탠다드의 첫번째 에디션은 수정을 거쳐 AMD1:1995가 되었다.(이 또한 C95라고 알려졌다)

이 또한 계속적인 수정( ISO/IEC 9899 )으로  인해 우리가 흔히 알고 있는 C99가 되었다.

'프로그래밍 > C' 카테고리의 다른 글

exit(1) vs exit(EXIT_FAILURE)  (0) 2012.02.29
file에서 읽어와 strtok을 이용해 struct에 저장하기  (2) 2012.02.28
enum vs #define vs const  (0) 2012.02.05
enum 타입 c vs c++  (0) 2012.02.04
system vs exec  (0) 2012.01.30
Posted by code cat
프로그래밍/C2012. 2. 5. 07:53
상수를 사용 할 일이 있을 때, 프로그래밍 언어(c vs c++)가 어느거냐에 따라서 호불호가 갈릴 수도 있겠지만 되도록 #define은 피하는게 좋다는 것은 변함이 없겠다.

#define은 전처리기에서 정의된 문자가 정의된 값으로 바뀌어서 처리된다.

예를 들어
#define BUF_SZ 1024

char buf[BUF_SZ];

라고 하면 전처리기의 실행 후에는

#define BUF_SZ 1024

char buf[1024];

라고 바뀐다. 이 후의 컴파일 과정에서는 BUF_SZ라는 매크로 심볼을 참조 할 수 없다. 여기서 발생할 수 있는 문제가 보통 컴파일러는 이 매크로 이름을 디버거로 넘겨주는 심볼 리스트에 포함시키지 않는다.
gcc 의 경우, -g3으로 매크로 정보를 포함시킬 있다.

또한 매크로는 scope에 대한 조절을 하기 어렵다. 예를 들어,
int getFoo(void)
{
#define LOCAL_VAL 124
....
}

는 지역적 scope를 가지지 않는다.

iPhone 에서 작성된 글입니다.

'프로그래밍 > C' 카테고리의 다른 글

file에서 읽어와 strtok을 이용해 struct에 저장하기  (2) 2012.02.28
C의 역사  (0) 2012.02.19
enum 타입 c vs c++  (0) 2012.02.04
system vs exec  (0) 2012.01.30
process & signal  (0) 2012.01.25
Posted by code cat