프로그래밍/C2012. 2. 4. 14:58



라고 enum 타입을 정의 했다고 치자.
그렇다면 이 enum 타입을 리턴하는 함수는 어떻게 정의 할까? c++ 라면 Food라고 해 줄 수 있지만, c에서는 아쉽게도 다음과 같이 써 줘야 한다.



이렇게 하는게 싫다면 typedef 으로 정의해 주면 된다.


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

C의 역사  (0) 2012.02.19
enum vs #define vs const  (0) 2012.02.05
system vs exec  (0) 2012.01.30
process & signal  (0) 2012.01.25
error: invalide storage class for function 'xxxx'  (0) 2011.11.29
Posted by code cat
프로그래밍/C2012. 1. 30. 08:07

system 으로 쉘 명령어를 실행시키거나 프로세스를 실행시키는건 대체적으로 좋지 않은 방법이다. 

이는 system 이 동작하기 위해 먼저 쉘을 실행시키기 때문이다. 이렇게 시작된 쉘은 각 설치된 쉘의 환경등에 따라 다른 동작성을 보일 수 있기 때문이다. 


그래서 보통 대체적으로 쓰이는 것이, exec 이며 exec 계열은 다음과 같이 나뉘어진다. 
execl, execle, execlp
execv, execve, execvp

그러나 이런 exec 또한 프로세스를 실행시킨 뒤 에러가 나지 않는 한 리턴되지 않는다.

즉,우리가 처음 시작한 프로세스에서 여러개의 프로세스를 실행시키기에는 부적합하다는 것이다. 


그래서 대신 자식 프로세스를 생성하거나 쓰레드를 생성하는 것이다

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

enum vs #define vs const  (0) 2012.02.05
enum 타입 c vs c++  (0) 2012.02.04
process & signal  (0) 2012.01.25
error: invalide storage class for function 'xxxx'  (0) 2011.11.29
대상체의 기억수명  (0) 2011.11.29
Posted by code cat
프로그래밍/C2012. 1. 25. 18:34
signal 라이브러리 함수은 다음과 같다.

void (*signal(int sig, void (*func)(int)))(int);

예)
위에 예제처럼 printf를 시그널 핸들러 함수에서 하는건 안전하지 않다.
그보다는, 시그널 핸들러가 플래그를 set하고 메인 함수에서 flag를 체크해서 그에 맞게 처리하는게 좋다.

하지만 X/Open 및 UNIX specifications은 sigaction이라는 프로그래밍 인터페이스를 사용하기를 권장한다.

#include <signal.n>
int sigaction(int sig, const struct sigaction *act, struct sigaction *oact);

설명
sigaction structure는 다음의 멤버들을 가지고 있다.
    void (*) (int) sa_handler  /* 함수, SIG_DFL, SIG_IGN*/
    sigset_t sa_mask            /* sa_handler에서 블록할 signal*/
    int sa_flags                    /* signal action modifier*/

sigaction 함수는 시그널 sig와 연관된 action을 설정한다.
 - oact가 null이 아닌 경우, sigaction은 이전의 signal action을 쓴다.
 -- act가 null인 경우, 아무 일도 안한다.
 -- act가 null이 아닌 경우, 시그널을 위한 action이 설정된다.

act에 의해 가리켜지는 sigaction 안에 있는 sa_handler는 시그널 sig가 들어오면 불려지는 함수에 대한 포인터이다.
sa_mask는 sa_handler가 불리기 전에 프로세스의 시그널 mask에 추가될 시그널 세트들을 설정한다.(이 세트들은 블록되어 프로세스로 전달되지 않는 시그널들이다.  sa_mask를 사용하면 race condition을 방지할 수 있다)

Return value
sigaction이 성공적일 경우, 0을 리턴하고 아닌 경우 -1을 리턴한다. A

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

enum 타입 c vs c++  (0) 2012.02.04
system vs exec  (0) 2012.01.30
error: invalide storage class for function 'xxxx'  (0) 2011.11.29
대상체의 기억수명  (0) 2011.11.29
열거, enum, 이놈  (0) 2011.11.28
Posted by code cat
리눅스2012. 1. 3. 08:59

(출처: Beginning Linux Programming 3rd edition)


알면서도 안 써먹는 거 같아서... 써 놓으면 생각날때 써먹을 수 있을거 같아서 쓴다.

umask는 open 혹은 create 호출을 통하여 파일을 만들 때 mode 매개변수를 umask와 비교한다.

mode 매개변수와 umask에 공통으로 설정되어 있는 비트는 제거된다.  결국 사용자는 "파일을 만드는 프로그램이 다른 사용자의 쓰기 권한을 요청하더라도 이 권한을 가지고 있는 어떤 파일도  만들면 안된다"라고 이야기하는 환경을 설정할 수 있다.


비록 그렇다고 해도 사용자나 프로그램이 chmod 명령을 연속으로 사용하여 다른 사용자의 쓰기 권한을 추가하는 것까지 방지할 수는 없다.  그렇지만 새로 생성하는 모든 파일에 대해 권한을 검사하고 설정하는 노력을 사용자로부터 덜어줄 수는 있다.


Posted by code cat
프로그래밍/C2011. 11. 29. 20:39

이런 에러가 나는 경우는, c는 함수가 다른 함수 안에나 블록 속에 정의되는 것을 허락하지 않기 때문이다.

바꿔 쉽게 말하자면, xxxx라는 함수 위에 있는 함수나 블록 중에서 }를 닫는 것을 잊어 먹었을 경우인 것이다.

{}을 잘 닫았는지 확인하고, 만약 혹시라도 블록 안에나 다른 함수에서 함수를 정의하려고 한다면, 이건 C 표준이 허락치 않는 걸 삽질하려는 것이다.

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

system vs exec  (0) 2012.01.30
process & signal  (0) 2012.01.25
대상체의 기억수명  (0) 2011.11.29
열거, enum, 이놈  (0) 2011.11.28
전처리기 (1)  (0) 2011.11.09
Posted by code cat