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

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

(4개의 수강평)

123명의 수강생

33,000원

ProgCoach4U
평생
초급, 중급
수료증
50개 수업, 총 13시간 2분
Wishlist
유영재 프로필

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

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

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

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

3
유영재 프로필

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

안녕하세요

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

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

7
유영재 프로필

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

안녕하세요.

리눅스 man page 기준으로

3번 함수 (라이브러리)

----------

2번 함수 (시스템 콜)

----------

커널

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

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

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

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

2
유영재 프로필

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

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

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

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

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

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

1
문수미 프로필

sigprocmask 질문입니다. 문수미 29일 전

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

5
유영재 프로필

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

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

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

int main(int argc, char **argv)

{

}

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

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

}

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

2
박균열 프로필

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

강의자료를 못찾아서 ..

1
문수미 프로필

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

실행했을 때 저 같은 경우는 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
유영재 프로필

struct tm 컴파일 문제 유영재 1달 전

struct tm에 대해서 찾아봤는데 gcc가 아닌 g++ libc인 것 같습니다.

그래서 찾지를 못하는데 선생님이랑 똑같은 makefile로 했는데도 해결이 안되어서

gcc =>g++로 해서 했더니 해결했습니다

혹시 몰라 gcc, g++ 컴파일러 버전을 올렸습니다. 아마 저는 16.04이긴 한데 업데이트가 늦은건가 모르겠네요

 

+++추가

    time_t now;

    struct tm *now_tm;

 

    now = time(NULL);

    printf("current : %ld\n", now);

    

    now_tm = localtime(&now);

처음에 이 부분만 따로 확인하려고 컴파일을 했는데 저런 오류가 나왔습니다. 시간정보 변환하고 다시 make하니 문제가 사라졌네요.

이상하네요. 저 부분만 작성하고나서 g++로 컴파일하면 문제가 사라지긴합니다.. 그래도 다른 분들 참고 부탁드릴게요!!!!

3
유영재 프로필

ITIMER_VIRTUAL이 실행되는 유저 영역 유영재 1달 전

ITIMER_VIRTUAL이 실행되는 시간은 코드를 한 줄씩 실행되는 시간만 카운팅을 한다는 말인가요? 예를 들어 가상메모리 교체시간 이런건 따로 카운팅을 하지 않는다는 말인가요?

3
유영재 프로필

date에 초 arg로 넣기 유영재 1달 전

Convert seconds since the epoch (1970-01-01 UTC) to a date$ date --date='@2147483647'

man page example에 잘 나와있네요! 와

 

1
유영재 프로필

강의자료 내용 건의드립니다. 유영재 1달 전

엄청 중요한건 아니고 20페이지, 21페이지에서 struct timeval *tv 파라미터 설명에서 20페이지 time에서는 현재까지 지난 '초'라고 딱 와닿았는데 21페이지에는 '시간'이라고 나와있어서 살짝 헷갈렸어서, '초' 혹은 ms, us로가 더 낫지 않을까 해서 남겨봅니다....

1
유영재 프로필

SIGKILL은 무시, 처리 둘 다 불가능한가요? 유영재 1달 전

교재에 SIGKILL & SIGSTOP은 무시(SIG_IGN)가 불가능하다고 써있는데 SIGKILL은 처리도 불가능한가요?

처리 핸들러를 만들었는데 함수 내로 들어오질 않습니다

그리고 무시라는 것은 시그널 블록을 말씀하시는거죠?

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

void sigterm_handler(void) {
    printf("into sigterm_handler\n");
}

void sigkill_handler(void) {
    printf("into sigkill_handler\n");
}

int main(int argc, char **argv) {
    signal(SIGKILL, (void *)sigkill_handler);
    signal(SIGTERM, (void *)sigterm_handler);
    printf("start of while(1)\n");
    while(1) {
        sleep(1);
    }   
    return 0;
}

1