📱인프런 모바일 App 😆
리눅스 시스템 프로그래밍 - 이론과 실습

리눅스 시스템 프로그래밍 - 이론과 실습

(4개의 수강평)

180명의 수강생

33,000원

평생
초급, 중급
수료증
50개 수업, 총 13시간 2분
위시리스트 추가
이웅희 프로필

스레드 생성, join 질문 이웅희 1일 전

스레드를 생성하고 함수를 실행하는 것이 먼저인데

왜 join 메시지가 먼저 뜨는건가요?

1
유영재 프로필

sigprocmask에서 oldset에 대한 질문입니다 유영재 26일 전

oldset에 동작이 어떻게 이뤄지는 지 궁금합니다

1. signal set, oldset을 초기화한 후

2. set에 SIGINT를 추가하고 block을 시키는데 여기서 oldset을 3번째 변수에 넣게되는데

이전에 시그널 proc이 없었기 때문에 oldset = NULL이라고 생각하면 될까요?

3. 그리고 oldset을 procmask에 등록을 시키면 이땐 아무 시그널도 block 되지 않는 것인가요?

 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <signal.h>

int main(int argc, char **argv) {
    sigset_t set, oldset;

    sigemptyset(&oldset);
    sigemptyset(&set);

    sigaddset(&set, SIGINT);
    printf("SIGINT BLOCKING........\n");
    sigprocmask(SIG_BLOCK, &set, &oldset);
    sleep(3);

    printf("SIGSETMASK......\n");
    sigprocmask(SIG_SETMASK, &oldset, NULL);
    while(1) {
        sleep(1);
    }
    return 0;
}

 

1
유영재 프로필

alarm과 sleep의 관계 유영재 27일 전

"alarm이 울리면 프로세스가 sleep 상태라면 깬다"라는 것은 알겠는데

좀 더 덧붙여주실 얘기가 있으신가요? 두 함수를 같이 쓰진 않나요 보통?

아니면 alarm과 sleep 시간을 동시에 준다든지요??

1
유영재 프로필

코드 작성에 대한 질문입니다 유영재 1달 전

fds 검사할 때 만약에 stdin이면 buf를 읽어서 그것을 출력하게 되는데

저는 printf("user write [%s]\n", buf)라고 입력하면 왜 %s뒤의 ]가 짤립니다. 즉 다음 버퍼로 밀려서

다음 출력에 ] expire~ 혹은 ]user write~ 이렇게 출력이 됩니다

3
유영재 프로필

select 관련 질문입니다 유영재 1달 전

안녕하세요 선생님 select 이론과 더불어 IO Multiplexing에 대해서 궁금한 점이 있습니다

이론 수업을 들을 때는 약간 하드웨어적으로 보면 인터럽트라고 느껴졌는데 라이브코딩을 보면서 결국엔 fd를 여러개 읽는 방법에서 polling이라고 느껴졌는데

제 개인적으로 정의를 내리자면 여러 fd를 읽을 수 있는 polling 방식이라고 느껴지는데 맞나요? 

그리고 추가적으로, select는 단발성이라서 주기적으로 등록을 해줘야 되는 것인가요?

4
유영재 프로필

clone과 pthread의 반환 시기가 차이가 있나요? 유영재 2달 전

쓰레드 함수가 일정 시간이 지나고 종료가 된다면 부모 혹은 커널에게 메모리를 반환하잖아요?

clone과 pthread로 쓰레드를 만들어서 무한루프를 돌리지 않고 전역변수에 데이터를 넣는? 처리를 하는데 pthread는 종료가 된 직후 바로 메모리를 반환해서 다음 쓰레드에서 이를 읽지 못하고, clone도 똑같이 바로 반환을 하는데 다음 쓰레드가 그 정보를 읽었습니다.

즉 메모리 반환 시기가 서로 다른 것 같은데 혹시 맞는 사실인가요? 

3
유영재 프로필

프로세스 생성 질문이 있습니다 유영재 2달 전

안녕하세요

프로세스 생성할 때, 만일 로그인 사용자 계정에서 sudo로 root로 로그인을 하거나 혹은 사용자 그대로인 상태에서 파일을 만들어서 stat을 하면 모두 다 로그인 계정 id로 뜨는데,

root id 이름의 프로세스(파일) 생성은 어떻게 할 수 있나요?

7
유영재 프로필

시스템 콜 함수에 대한 질문입니다 유영재 2달 전

안녕하세요.

리눅스 man page 기준으로

3번 함수 (라이브러리)

----------

2번 함수 (시스템 콜)

----------

커널

이렇게 계층?이 나눠진 것으로 알고 있습니다. 3번 함수는 2번 함수를 좀 더 사용자가 쉽게 쓰고자 제공한 것으로 알고 있습니다

그런데 공부하다보니 2번 함수 밑에도 원본?계층이 존재하는 것 같은데?

가령 syscall(__NR__, ..., ... , ...) 이렇게 부르는 경우가 있는데 이 점에 대해서 한번 짚어주실 수 있나요?

예시를 원하시면 예시 코드를 올리도록 하겠습니다

2
유영재 프로필

프로세스 생성에 대한 질문입니다 유영재 2달 전

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/wait.h>
#include <sys/types.h>

int main(int argc, char **argv)
{
    int exit_status;
    pid_t pid;
    struct stat buf;

    memset(&buf, 0, sizeof(struct stat));
    
    printf("parent process:%d\n", getpid());    
    for(int i=0; i<2; i++) {
        pid = fork();
        if(pid == 0) {
            int n = 5;
            while(n--) {
                // stat("/proc/`getpid()`/stat", &buf);
                // printf("gid:%d pid:%d\n", (int)buf.st_gid, (int)getpid());
                printf("pid:%d\n", getpid());
                sleep(3);
            }
        }
        else if(pid > 0) {
            wait(&exit_status);
        }        
    }

    printf("Done...\n");
    return 0;
}

fork를 완전히 이해했다고 생각했는데, 제 생각 범위에서 일종의 bug 프로세스가 나오는데요....

코드를 보면 각각의 pid를 5번씩 출력하고 끝내야 하는데, 이 출력 마지막에 새로운 프로세스가 5번 더 출력이 되는데 왜 그런건가요....?

2
유영재 프로필

자식 스레드에서의 exec 실행에 대한 질문입니다. 유영재 2달 전

fork 후 자식 프로세스에서 exec를 실행하면 완전히 프로세스가 구분되어져서 , pid == 0 ㅇ안에서 exec 뒤에 있는 소스는 실행이 전혀 되지 않았습니다

그런데 스레드에서는 조금은 다르게 같은 스레드 그룹이라서 

"after exec"가 실행될줄 알았는데 실제론 그렇지 않네요...

 

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

void *child_thread_main(void *arg)
{
    printf("Before exec\n");
    execl("/bin/ls", "-al", NULL);
    printf("After exec\n");

    return NULL;
}

int main(int argc, char **argv) 
{    
    int ret;
    pthread_t child_thread;
    
    ret = pthread_create(&child_thread, NULL, child_thread_main, NULL);
    if(ret) {
        printf("pthread_create(%d)\n", ret);
        return -1;
    }
    
    ret = pthread_join(child_thread, NULL);
    if(ret) {
        printf("pthread_join(%d), str_err:%s\n", 
                ret, strerror(ret));
        return -1;
    }

    printf("Done..\n");
    return 0;
}

3
유영재 프로필

pthread_self() 관련해서 질문입니다 유영재 2달 전

pthread_self는 쓰레드 ID를 출력한다고 알고 있는데

phread_self에서 출력하는 내용은 pid와 관계가 없는 건가요?

프로세스와 쓰레드는 모두 리눅스에서 task로 처리하고 이를 구분하기 위해 task_struct를 사용합니다. pthread_self는 task_struct에 있는 내용은 아닌가요? 제 생각에는 syscall(__NR_gettid)와 같은 값이 반환되는 줄 알았습니다

1
문수미 프로필

sigprocmask 질문입니다. 문수미 2달 전

시그널 블록킹을 하는 이유는 해당 signal을 실행할 경우 인터럽트 처리에서 글로벌 데이터가 손상될 가능성이 있기 때문인가요?? sigprocmask API를 사용하는 상황이 잘 이해가 안갑니다 ㅠㅠ

5
유영재 프로필

리눅스 소스파일 작성법에 대해서 질문이 있습니다 유영재 2달 전

수업에 관련된 질문은 아님을 먼저 알려드립니다..

이클립스 IDE에서 Code Formatter라고 해서 GNU 선택란이 있었는데 예시 코드를 보니까

int main(int argc, char **argv)

{

}

이렇게 괄호를 아래로 끌어서 쓰는데 저는 보통 코드 길이 때문에 스타일을 바꿔서

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

}

이렇게 쓰는데 이 작성법은 GNU 작성법에 어긋나는 경우인가요? 

2
박균열 프로필

강의자료가 어디있나요? 박균열 2달 전

강의자료를 못찾아서 ..

1
문수미 프로필

실행이 조금 다른데요 문수미 2달 전

실행했을 때 저 같은 경우는 parent process pid : ~~ 프린트 되고나서 child process pid ~~~가 프린트 됩니다. 그리고 this is the function(pid)가 parent, child 순으로 총 두번 연속해서 출력되는데요. 강의에서는 parent pid 출력된 후 this is the function 출력되고 child pid 출력 후 다시 this is the function이 출력됐습니다. 이부분이 저랑 조금 다른데 왜 그런건가요??

2