기본 if 문법

 

 if test "taesun" = "taesun"

then

echo "TRUE"

else

echo "FALSE"

fi

exit 0

 

 

비교 연산자

 

산술 연산자

 

 

 Shell script 작성과 실행

 

C언어의 출력 = printf(); 이지만. Shell script에서는 echo로 나타낸다.

 기본적으로 echo명령이실행되고 나면 줄바꿈이 되어 진다. 줄바꿈을 하지않고 출력하려면 

echo -n 변수 


ex)

 

echo "사용자 이름 : "$USER

exit 0

 

위와 같이 스크립트파일을 만들때는 .sh로 만들고 실행할때는 sh *.sh로 실행한다.

 

변수 선언

 

변수를 사용하기 전에 미리 선언하지 않아도 되며, 처음값이 할당되면서 자동으로 변수가 생성된다.

모든 문자열은 string형태로 취급된다.(숫자를 넣어도 문자로  취급.)

변수 이름은 대소문자를 구분한다.

변수를 대입할 때는 '=' 좌우 공백이 없어야 함.

 

변수에 공백이 들어갈때는 위에 보이듯이 ""로 묶어줘야 한다.

7+5는 정상적으로 들어가지만 이를 연산으로 보는게 아니고, 문자열로 인식한다.

 

변수는 $를 앞에 붙여서 나타내는데, $문자가 들어간 글자를 출력하기 위해서는 ''로 묶어 주면 된다.

 

ex)

myvar=Hi
echo $myvar
echo "$myvar"
echo '$myvar'
echo /$myvar
read myvar
echo '$myvar = '$myvar
exit 0

 

3번째 줄은 ''로 묶었기 때문에 $myvar를 하나의 문자열로 인식하여 그대로 출력한 것이다.

입력(C언어의 scanf();)를 받을때는 read로 받는다.

 

 

이번엔 어떠한 문구도 나와있지 않고 사진만 나와있다. 역시 소스보기

 

 

사진에 linkedlist.php?nothing=12345로 링크가 되어있는게 보인다. 사진을 클릭하면.

 

아마도 URL의 nothing값을 계속 바꿔줘야 하는 것 같다.

 

손으로 하기 힘들 것이라고 빨간문구로 경고문이 나온다. 역시 python으로 소스를 짜보자.

 

 

 

link라는 변수에 nothing=까지만 저장을하고 b에 nothing에 넣을 숫자를 저장한다.

숫자의 형태를 보면, 5자리 숫자이다.따라서 뒤에서 5번째까지만 슬라이싱해서 URL에 붙여넣으면 된다.

일단 urlopen으로 값을 읽어들이고 뒤에서 5번째부터 끝까지 슬라이싱을 한다음에, link+b의 URL을 오픈한다. 그리고 나오는 값을 print 몇개가 있을지 몰라서 무한루프문을 돌려서 값을 보기로 함.

언뜻보기에도 50번넘게 실행을 한후에 peak.html이라는 답이 나온다.

while()무한루프를 돌리고 딴 짓을하다가 계속안끝나서 보니 nothing=.html해도 다음값이 있어서 못보고 넘어간듯싶다 ㅠㅠ 실행시키고 넘어가지 않게끔!

'Programming > Python' 카테고리의 다른 글

Python challenge 3  (1) 2012.05.23
Python challenge 2  (0) 2012.05.23
Python challenge 1  (0) 2012.05.15
Python challenge 0  (0) 2012.05.15
Python Method  (0) 2012.05.15

 

이번 문제는 ...하나의 작은 단어? 곁에 세개의 큰보디가드가 있다는 건데 먼소리지 역시 이럴땐 소스보기

 

소스를 보자마자 알것같다.. 아마도 소문자 양옆으로 꼭 세개의 대문자가 있는 소문자를 뺴라는 뜻인 듯 하다.

 

문제 풀이 코드

 

 

해당 url에 커넥션을 맺고, 데이터를 읽어들인 후에, 2번 문제에서처럼 주석표시를 기준으로 데이터를 저장한다. 그리고, 정규표현식에 맞춰, 소문자 대문자3개 소문자 대문자3개 소문자 인 형태를 찾고, el변수에 저장하고,출력.

 

 

답 : linkedlist

 

'Programming > Python' 카테고리의 다른 글

Python Challenge 4  (0) 2012.05.23
Python challenge 2  (0) 2012.05.23
Python challenge 1  (0) 2012.05.15
Python challenge 0  (0) 2012.05.15
Python Method  (0) 2012.05.15

 

 

문제를 보면 페이지 소스를 보라는 뜻인거 같다.

소스를 보니까...

 

대충 특수문자속에 알파벳이 섞여 있다는 뜻인것 같고, 그 알파벳을 찾아야 하는 문제인가보다.

 

 문제 풀이 코드.

 

urllib.urlopen함수를 이용, url에 있는 데이터를 읽어들인다.

일단 주석처리가 두번 되있으므로, rindex함수를 이용해서 뒤에서 부터 주석기호를 찾고, 그안에 해당하는 문자를 변수에 저장을 한다. 그리고 알파벳이 소문자일거라 가정을 하고, for문을 돌려서 L에 저장 한다음에 출력하는 소스.

 

 

 

결과값 : equality

'Programming > Python' 카테고리의 다른 글

Python Challenge 4  (0) 2012.05.23
Python challenge 3  (1) 2012.05.23
Python challenge 1  (0) 2012.05.15
Python challenge 0  (0) 2012.05.15
Python Method  (0) 2012.05.15

Extern 함수는 변수 이름에 extern을 붙여주면 external linkage를 갖게 되어 다른 모듈에서 링크 할 수 있게 해준다.

 

ex)

main.c

 

#include<stdio.h>

 

extern int func_sum(int k);

 

int main(int argc,char *argv[]){

 

int i;

int k;

int sum=0;

 

if(argc<2){

fprintf(stderr,"Usage : Main 3\n");

exit(1);

}

 

k=atoi(argv[1]);

sum = func_sum(k);

 

printf("sum = %d\n",sum);

 

return 0;

}

 

 

func_sum.c

 

#include<stdio.h>

 

int func_sum(int k){

int i;

int sum=0;

 

for(i=0;i<=k;i++)

sum+=i;

 

return sum;

}

 

 

컴파일시에 링크를 걸어줘야 함.

 

<stdio.h 헤더파일>

'Programming > C' 카테고리의 다른 글

열거형 enum  (0) 2012.07.09
sscanf , sprintf  (0) 2012.07.06
문자열 붙이기 Strcat()  (0) 2012.07.04
Strtok 문자열 자르기  (0) 2012.06.29
함수 포인터  (0) 2012.05.07

Mutex란?

 

Mutual Exclustion의 으로, Critical Section문제를 해결하기 위한 방법중 하나이다.

뮤텍스 개체는 잠겨지지 않은(unlocked)상태와 잠금(locked)상태의 두가지 상태를 가지며, 동시에 둘 이상의 쓰레드가 소유할 수 없다. 뮤텍스는 잠그기 위해 기다리는 쓰레드들을 위한 큐를 가지고 있어서, 이미 다른 쓰레드에 의해 잠겨 있는 뮤텍스를 획득하려고 시도하면 쓰레드는 큐에 들어가고 다시 대기상태로 빠지게 된다.

 

Mutex 생성,소멸 함수.

 

#include<pthread.h>

int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *addr);

int pthread_mutex_destroy(pthread_mutex_t *mutex);

 

mutex -> 뮤텍스 생성시에는 뮤텍스의  참조 값 저장을 위한 변수의 주소 값 전달, 그리고 뮤텍스

소멸 시에는 소멸하고자 하는 뮤텍스의 참조 값을 저장하고 있는 변수의 주소값 전달.

 

attr -> 생성하는 뮤텍스의 특성정보를 담고 있는 변수의 주소 값 전달. 별도의 특성을 지정하지 않을

   경우 NULL 전달.

 

Mutex lock,unlock 함수

 

#include<pthread.h>

int pthread_mutex_lock(pthread_mutex *mutex);

int pthread_mutex_unlock(pthread_mutex *mutex);

 

예제)

 

#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<pthread.h>

#define NUM_THREAD 100

 

void *thread_inc(void *arg);
void *thread_des(void *arg);
long long num =0;

 

int main(int argc,char *argv[]){

 

        pthread_t thread_id[NUM_THREAD];    //Thread ID를 저장할 배열.
        int i;

 

        printf("sizeof long long : %d\n",sizeof(long long));
        for(i=0;i<NUM_THREAD;i++){
                if(i%2)
                        pthread_create(&(thread_id[i]),NULL,thread_inc,NULL);    

//thread를 생성하고, 생성된 thread는 thread_inc를 실행한다.
                else
                        pthread_create(&(thread_id[i]),NULL,thread_des,NULL);

//thread를 생성하고, 생성된 thread는 thread_des를 실행한다.
        }

        for(i=0;i<NUM_THREAD;i++)
                pthread_join(thread_id[i],NULL);    //각각의 thread가 끝날때까지 주프로세스가기다림.

        printf("result : %lld \n",num);
        return 0;
}

void *thread_inc(void *arg){    //짝수 thread가 실행하는 부분.
        int i;
        for(i=0;i<50000000;i++)
                num+=1;
}

void *thread_des(void *arg){    //홀수 thread가 실행하는 부분.
        int i;
        for(i=0;i<50000000;i++)
                num-=1;
}

<출처 : 윤성우 열혈 TCP/IP 소켓프로그래밍>

 

위와 같은 소스를 가지고 있는 프로그램이 있다. 쓰레드를 100개 생성시키고, 50개는 num을 증가시키고 나머지 50개는 num을 감소시키는 프로그램이다. 이 프로그램을 실행시키면 원하는 답은 0이지만 실행 결과는 그렇지 않다.

 

위와 같은 일이 발생하는 이유는 Critical Section(임계영역)문제인데, 이와 관련해서는 이 전의 포스팅을 참조하기 바란다.

http://taesun1114.tistory.com/entry/%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4%EA%B0%84-%ED%86%B5%EC%8B%A0%EA%B3%B5%EC%9C%A0%EB%A9%94%EB%AA%A8%EB%A6%AC

따라서, 각각의 쓰레드가 num+=1 or num-=1을 실행할 때는 다른 쓰레드가 이 부분에 접근하면 안된다. 이를 위해서 Mutex를 사용한다.

 

#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<pthread.h>

 

#define NUM_THREAD 100

 

void *thread_inc(void *arg);
void *thread_des(void *arg);
long long num =0;

 

int main(int argc,char *argv[]){

 

pthread_t thread_id[NUM_THREAD];    //Thread ID를 저장할 배열.
int i;

pthread_mutex_init(&mutex,NULL);    // mutex생성함수.

 

printf("sizeof long long : %d\n",sizeof(long long));


for(i=0;i<NUM_THREAD;i++){
        if(i%2)
            pthread_create(&(thread_id[i]),NULL,thread_inc,NULL);

//Thread를 생성하고 thread_inc를 실행한다.
        else
            pthread_create(&(thread_id[i]),NULL,thread_des,NULL);

//Thread를 생성하고 thread_des를 실행한다.
}

for(i=0;i<NUM_THREAD;i++)
        pthread_join(thread_id[i],NULL);    //각각의 thread가 끝날때까지 기다림.

 

printf("result : %lld \n",num);

pthread_mutex_destroy(&mutex);    //Mutex소멸함수.


return 0;
}

 

void *thread_inc(void *arg){
    int i;

    pthread_mutex_lock(&mutex);    //Mutex를 이용,다른쓰레드의 접근을 막는다.
    for(i=0;i<50000000;i++)
        num+=1;

    pthread_mutex_unlock(&mutex);    //Critical section을 벗어났으므로, 다른쓰레드 접근허용.
}

 

void *thread_des(void *arg){
    int i;

    pthread_mutex_lock(&mutex);    //다른 쓰레드의 접근을 막는다.
    for(i=0;i<50000000;i++)
        num-=1;

    pthread_mutex_unlock(&mutex);    //Critical section을 벗어났으므로, 다른쓰레드 접근허용.

}

 

'O.S' 카테고리의 다른 글

IDT / LDT / GDT / SSDT  (1) 2012.09.26
Flag Register  (0) 2012.07.20
Classic Problems of Synchronization / Monitor  (0) 2012.04.27
Synchronization Hardware  (0) 2012.04.27
Semaphore  (0) 2012.04.27

앞의 포스팅에서 설명한 멀티플렉싱 기법을 구현하는데 가장 많이 사용되는 방법이 바로 Select함수를 이용하는 것이다. 또한 리눅스 뿐만 아니라 윈도우에도 같은 이름으로 동일한 기능을 제공하는 함수가 있기 때문에 이식성에도 좋다.

 

#include<sys/select.h>

#include<sys/time.h>

 

int select(int maxfd, fd_set *readset, fd_set *writeset, fd_set *exceptest, const struct timeval *timeout);

->성공시 0이상 실패시 -1 반환.

 

maxfd -> 검사 대상이 되는 파일 디스크립터의 수.

 

readset -> fd_set형 변수에 수신된 데이터의 존재여부에 관심 있는 파일 디스크립터 정보를 모두

  등록해서 변수의 주소값 전달.

 

writeset -> fd_set형 변수에 블로킹 없는 데이터 전송의 가능여부에 관심 있는 파일 디스크립터 정보를

  모두 등록해서 그 변수의 주소 값을 전달한다.

 

exceptset -> fd_set형 변수에 예외상황의 발생여부에 관심이 있는 파일 디스크립터 정보를 모두

     등록해서 그 변수의 주소 값 전달.

 

 

Select 함수의 기능

 

Select 함수를 이용하면 한곳에 여러개의 파일 디스크립터를 모아놓고 동시에 관찰할 수 있다.

 

1. 수신한 데이터를 지니고 있는 소켓이 존재하는지.

2. 불로킹되지 않고 데이터의 전송이 가능한 소켓은 무엇인지.

3.예외상황이 발생한 소켓은 무엇인지.

 

를 관찰할수가 있다.

 

Select 함수 호출순서 

 

 

Select 함수를 호출하기 전에는 파일디스크립터,검사 범위, 타임아웃의 설정을 해줘야 비로소 Select함수를 호출할 수가 있다.

 

파일디스크립터 설정

 

Select 함수를 이용하여 여러개의 파일디스크립터를 관리할 수 있는데, 여러개의 파일디스크립터를 모을 떄도 목적에 따라서 구분해서 모아야 하고, 파일 디스크립터를 모을 때 사용하는 것이 fd_set형 변수이다. fd_set형은 0과 1로 표현되는, 비트단위로 이뤄진 배열이다.

 

                       <fd_set 자료형>

 

fd_set형 변수를 조작하기 위해서는 매크로 함수를 이용하면 된다.

 

FD_ZERO(fd_set *fdset)        

//인자로 전달된 주소의 fd_set형 변수의 모든 비트를 0으로 초기화.

FD_SET(int fd, fd_set *fdset)

//매개변수 fdset으로 전달된 주소의 변수에 매개변수 fd로 전달된 파일 디스크립터 정보 저장.

 

FD_CLR(int fd,fd_set *fdset)

//매개변수 fdset으로 전달된 주소의 변수에 매개변수 fd로 전달된 파일 디스크립터 정보 삭제.

 

FD_ISSET(int fd,fd_set *fdset)

//매개변수 fdset으로 전달된 주소의 변수에 매개변수 fd로 전달된 파일 디스크립터 정보가 있으면 양수반환.

'Programming > Socket' 카테고리의 다른 글

I/O 멀티플렉싱  (0) 2012.05.15
로그파일을 남기는 서버  (0) 2012.05.14
클라이언트 IP 가져오기  (0) 2012.05.14
멀티프로세스 소스  (0) 2012.05.10
멀티프로세스 서버  (0) 2012.05.08

앞서 멀티프로세스 서버를 구현하였으나, 멀티프로세스 서버는 클라이언트 연결요청이 있을 때마다, 새로운 프로세스를 생성하는 기법으로, 상당히 많은 양의 연산이 요구되고, 필요한 메모리 공간도 비교적 큰 편이다.

 

따라서 프로세스의 생성을 동반하지 않고, 다수의 클라이언트들에게 서비스를 제공할 수 있는 방법으로 나온 것이 멀티 플렉싱기법이다.

 

멀티플렉싱은 물리적 장치의 효율성을 높이기 위해 최소한의 물리적인 요소만 사용해서 최대한의 데이터를 전달하기 위해 사용하는 기술이다.

 

기존의 자식프로세스를 생성해서 서비스를 하는 멀티프로세스 서버와는 달리,

 

멀티플렉싱개념을 사용하면,

 

자식프로세스가 각각의 소켓을 처리하는게 아니고, 서버하나가 각각의 소켓에 대한 서비스를 제공하는게 멀티플렉싱의 개념이다.

 

멀티플렉싱과 멀티프로세스의 차이는 서비스를 제공하는 프로세스 갯수의 차이가 각각 한개와, 클라이언트수만큼이라는 것이다.

 

 

멀티플렉싱 서버를 사용하기 적합한 경우.

1. 클라이언트와 서버간의 송수신 데이터 용량이 작은 경우 적합
2. 송수신이 연속적이지 않은 경우에 적합 
3. 멀티 프로세스 기반에 비해 많은 수의 클라이언트 처리에 적합


 

'Programming > Socket' 카테고리의 다른 글

Select 함수  (0) 2012.05.16
로그파일을 남기는 서버  (0) 2012.05.14
클라이언트 IP 가져오기  (0) 2012.05.14
멀티프로세스 소스  (0) 2012.05.10
멀티프로세스 서버  (0) 2012.05.08

 

노트에 적혀있는 글자를 보니 왠지 2칸씩 밀리는 시저사이퍼가 생각이 난다. 그래서 파이썬을 공부하고 있지만.....약간의 편법으로

 

 

ㅋ...출제자는 손으로 푼건아닌지 걱정하는데 손으로 푼건아니니까 그래도 친절하게 string.maketrans를 사용하라고 추천해준다.

maketrans를 조사해보니 테이블맵에 맞게 문자열을 변환해주는 함수라고 한다. 역시 파이썬은 없는게 없는듯...

http://taesun1114.tistory.com/entry/Python-Method 

 

사용법대로 따라서 해보자.

 

답이 나왔다. url에도 시저사이퍼를 적용해보라고 한다. map -> ocr

 

 

'Programming > Python' 카테고리의 다른 글

Python Challenge 4  (0) 2012.05.23
Python challenge 3  (1) 2012.05.23
Python challenge 2  (0) 2012.05.23
Python challenge 0  (0) 2012.05.15
Python Method  (0) 2012.05.15

+ Recent posts