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

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

(8개의 수강평)

232명의 수강생
33,000원
지식공유자 · ProgCoach4U
50회 수업 · 총 13시간 2분 수업
평생 무제한 시청
수료증 발급 강좌
수강 난이도 '초급, 중급'
꿀렁꿀렁 프로필

논블로킹 모드 관련 질문입니다. 꿀렁꿀렁 18일 전

저의경우 fcntl 바이너리를 1회 실행후 2회 실행하여도 강사님처럼 논블로킹 모드로 유지가 안되는데, 이건 쉘의 특성인가요? 현재는 저는 CentOS 에서 실습하고 있습니다.

1
꿀렁꿀렁 프로필

하드링크 및 소프트링크 관련 질문드립니다. 꿀렁꿀렁 1달 전

안녕하세요.

원본파일 hello 와 하드링크 파일인 hard 그리고 소프트링크 파일인 soft 가 존재하는 상황에서

원본파일인 hello 파일을 삭제했다고 가정합니다.

여기서 의문점이 하나 생겼는데, hello 가 지워졌다고 하더라도, hard 에 의해서 원본 데이터는 디스크상에 보존이 되고 soft 의 inode 값은 별도로 관리가 되는데,

이런 경우 원본파일이 삭제되더라고 soft 파일은 디스크상의 파일을 가리켜야 하는게 맞지 않는건가요~?

답변 부탁드립니다. 감사합니다~

1
꿀렁꿀렁 프로필

하드링크와 소프트링크 설명하시는 그림 예제에서 꿀렁꿀렁 1달 전

그림상으로 봤을때, 소프트링크의 inode 가 빨간색 디스크 파일을 가리켜야 하는게 맞지 않을까요?

파란색 파일을 가리키도록 도안이 그려져 있어서 문의드려봅니다.

1
꿀렁꿀렁 프로필

소프트링크와 하드링크는 어떤경우에 사용해야 적절한가요? 꿀렁꿀렁 1달 전

이론과 실습으로 두 파일의 차이점은 알겠는데,

실무에서 두 파일을 어떻게 사용해야하는지 궁금하네요.

1
이웅희 프로필

스레드 생성, join 질문 이웅희 2달 전

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

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

1
유영재 프로필

sigprocmask에서 oldset에 대한 질문입니다 유영재 2달 전

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의 관계 유영재 2달 전

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

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

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

1
유영재 프로필

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

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

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

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

3
유영재 프로필

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

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

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

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

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

4
유영재 프로필

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

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

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

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

3
유영재 프로필

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

안녕하세요

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

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

7
유영재 프로필

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

안녕하세요.

리눅스 man page 기준으로

3번 함수 (라이브러리)

----------

2번 함수 (시스템 콜)

----------

커널

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

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

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

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

2
유영재 프로필

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

#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 실행에 대한 질문입니다. 유영재 4달 전

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() 관련해서 질문입니다 유영재 4달 전

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

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

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

1