월 17,600원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결리눅스 시스템 프로그래밍 - 이론과 실습
스레드 생성, join 질문
스레드를 생성하고 함수를 실행하는 것이 먼저인데 왜 join 메시지가 먼저 뜨는건가요?
- 미해결리눅스 시스템 프로그래밍 - 이론과 실습
sigprocmask에서 oldset에 대한 질문입니다
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; }
- 미해결리눅스 시스템 프로그래밍 - 이론과 실습
alarm과 sleep의 관계
"alarm이 울리면 프로세스가 sleep 상태라면 깬다"라는 것은 알겠는데 좀 더 덧붙여주실 얘기가 있으신가요? 두 함수를 같이 쓰진 않나요 보통? 아니면 alarm과 sleep 시간을 동시에 준다든지요??
- 미해결리눅스 시스템 프로그래밍 - 이론과 실습
코드 작성에 대한 질문입니다
fds 검사할 때 만약에 stdin이면 buf를 읽어서 그것을 출력하게 되는데 저는 printf("user write [%s]\n", buf)라고 입력하면 왜 %s뒤의 ]가 짤립니다. 즉 다음 버퍼로 밀려서 다음 출력에 ] expire~ 혹은 ]user write~ 이렇게 출력이 됩니다
- 미해결리눅스 시스템 프로그래밍 - 이론과 실습
select 관련 질문입니다
안녕하세요 선생님 select 이론과 더불어 IO Multiplexing에 대해서 궁금한 점이 있습니다 이론 수업을 들을 때는 약간 하드웨어적으로 보면 인터럽트라고 느껴졌는데 라이브코딩을 보면서 결국엔 fd를 여러개 읽는 방법에서 polling이라고 느껴졌는데 제 개인적으로 정의를 내리자면 여러 fd를 읽을 수 있는 polling 방식이라고 느껴지는데 맞나요? 그리고 추가적으로, select는 단발성이라서 주기적으로 등록을 해줘야 되는 것인가요?
- 미해결리눅스 시스템 프로그래밍 - 이론과 실습
clone과 pthread의 반환 시기가 차이가 있나요?
쓰레드 함수가 일정 시간이 지나고 종료가 된다면 부모 혹은 커널에게 메모리를 반환하잖아요? clone과 pthread로 쓰레드를 만들어서 무한루프를 돌리지 않고 전역변수에 데이터를 넣는? 처리를 하는데 pthread는 종료가 된 직후 바로 메모리를 반환해서 다음 쓰레드에서 이를 읽지 못하고, clone도 똑같이 바로 반환을 하는데 다음 쓰레드가 그 정보를 읽었습니다. 즉 메모리 반환 시기가 서로 다른 것 같은데 혹시 맞는 사실인가요?
- 미해결리눅스 시스템 프로그래밍 - 이론과 실습
프로세스 생성 질문이 있습니다
안녕하세요 프로세스 생성할 때, 만일 로그인 사용자 계정에서 sudo로 root로 로그인을 하거나 혹은 사용자 그대로인 상태에서 파일을 만들어서 stat을 하면 모두 다 로그인 계정 id로 뜨는데, root id 이름의 프로세스(파일) 생성은 어떻게 할 수 있나요?
- 미해결리눅스 시스템 프로그래밍 - 이론과 실습
시스템 콜 함수에 대한 질문입니다
안녕하세요. 리눅스 man page 기준으로 3번 함수 (라이브러리) ---------- 2번 함수 (시스템 콜) ---------- 커널 이렇게 계층?이 나눠진 것으로 알고 있습니다. 3번 함수는 2번 함수를 좀 더 사용자가 쉽게 쓰고자 제공한 것으로 알고 있습니다 그런데 공부하다보니 2번 함수 밑에도 원본?계층이 존재하는 것 같은데? 가령 syscall(__NR__, ..., ... , ...) 이렇게 부르는 경우가 있는데 이 점에 대해서 한번 짚어주실 수 있나요? 예시를 원하시면 예시 코드를 올리도록 하겠습니다
- 미해결리눅스 시스템 프로그래밍 - 이론과 실습
프로세스 생성에 대한 질문입니다
#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번 더 출력이 되는데 왜 그런건가요....?
- 미해결리눅스 시스템 프로그래밍 - 이론과 실습
자식 스레드에서의 exec 실행에 대한 질문입니다.
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; }
- 미해결리눅스 시스템 프로그래밍 - 이론과 실습
pthread_self() 관련해서 질문입니다
pthread_self는 쓰레드 ID를 출력한다고 알고 있는데 phread_self에서 출력하는 내용은 pid와 관계가 없는 건가요? 프로세스와 쓰레드는 모두 리눅스에서 task로 처리하고 이를 구분하기 위해 task_struct를 사용합니다. pthread_self는 task_struct에 있는 내용은 아닌가요? 제 생각에는 syscall(__NR_gettid)와 같은 값이 반환되는 줄 알았습니다
- 미해결리눅스 시스템 프로그래밍 - 이론과 실습
sigprocmask 질문입니다.
시그널 블록킹을 하는 이유는 해당 signal을 실행할 경우 인터럽트 처리에서 글로벌 데이터가 손상될 가능성이 있기 때문인가요?? sigprocmask API를 사용하는 상황이 잘 이해가 안갑니다 ㅠㅠ
- 미해결리눅스 시스템 프로그래밍 - 이론과 실습
리눅스 소스파일 작성법에 대해서 질문이 있습니다
수업에 관련된 질문은 아님을 먼저 알려드립니다.. 이클립스 IDE에서 Code Formatter라고 해서 GNU 선택란이 있었는데 예시 코드를 보니까 int main(int argc, char **argv) { } 이렇게 괄호를 아래로 끌어서 쓰는데 저는 보통 코드 길이 때문에 스타일을 바꿔서 int main(int argc, char **argv) { } 이렇게 쓰는데 이 작성법은 GNU 작성법에 어긋나는 경우인가요?
- 미해결리눅스 시스템 프로그래밍 - 이론과 실습
강의자료가 어디있나요?
강의자료를 못찾아서 ..
- 미해결리눅스 시스템 프로그래밍 - 이론과 실습
실행이 조금 다른데요
실행했을 때 저 같은 경우는 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이 출력됐습니다. 이부분이 저랑 조금 다른데 왜 그런건가요??
- 미해결리눅스 시스템 프로그래밍 - 이론과 실습
struct tm 컴파일 문제
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++로 컴파일하면 문제가 사라지긴합니다.. 그래도 다른 분들 참고 부탁드릴게요!!!!
- 미해결리눅스 시스템 프로그래밍 - 이론과 실습
ITIMER_VIRTUAL이 실행되는 유저 영역
ITIMER_VIRTUAL이 실행되는 시간은 코드를 한 줄씩 실행되는 시간만 카운팅을 한다는 말인가요? 예를 들어 가상메모리 교체시간 이런건 따로 카운팅을 하지 않는다는 말인가요?
- 미해결리눅스 시스템 프로그래밍 - 이론과 실습
date에 초 arg로 넣기
Convert seconds since the epoch (1970-01-01 UTC) to a date$ date --date='@2147483647' man page example에 잘 나와있네요! 와
- 미해결리눅스 시스템 프로그래밍 - 이론과 실습
강의자료 내용 건의드립니다.
엄청 중요한건 아니고 20페이지, 21페이지에서 struct timeval *tv 파라미터 설명에서 20페이지 time에서는 현재까지 지난 '초'라고 딱 와닿았는데 21페이지에는 '시간'이라고 나와있어서 살짝 헷갈렸어서, '초' 혹은 ms, us로가 더 낫지 않을까 해서 남겨봅니다....
- 미해결리눅스 시스템 프로그래밍 - 이론과 실습
SIGKILL은 무시, 처리 둘 다 불가능한가요?
교재에 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; }