LinuxProgramming
-
[Linux] select()LinuxProgramming 2023. 11. 22. 00:05
서버일 경우에는 불필요하게 계속 read를 할 필요가 없음 그래서 데이터가 없는 경우에는 blocking 해주는게 맞음 서버는 만약 아무도 안보내면 blocking 하길 원함 만약 누가 보내면 그때 blocking을 해제하고 읽을 수 있었으면 함 그리고 만약 1명 이상이 보내면 순서대로 읽었으면 함. 이런 프로그램을 만들려면 select를 사용해야함. 참고로 select는 read가 아님 어느 파이프가 준비되었는지 알려주는거지 read까지 해주는게 절대아님 여러 파이프 중에서 어느 파이프에서 데이터가 왔는지를 검사하는 시스템 콜임. 그래서 검사를 해서 한 군데에서라도 데이터가 안왔으면 select에서 block을 함. read에서 blocking을 하는게 아니라 select에서 blocking을 함. 한..
-
[Linux] file synchronizationLinuxProgramming 2023. 11. 4. 16:16
[Memory-File Synchronization] secondary storage(HDD SSD)에 있는 파일들을 내 컴퓨터의 physical memory인 RAM에 올려 작업하는 일 file에 single process로 접근할때 쓰인다 목적은 RAM에 올려 작업한게 작업종료하면 secondary storage로 잘 반영시키는 것이다. text editor, word, DB작업 등이 이에 해당한다. MS_SYNC : file에 모두 다 쓰기 전까지는 return 안함. 작업 다 끝나기 전까지는 다음 코드 진행 안한다는 소리다 MS_ASYNC : synchronization을 background process로 돌림. 다음 코드 진행하면서 동기화함 [Interprocess Synchronization..
-
[Linux] opendir() and readdir()LinuxProgramming 2023. 10. 22. 02:28
[DIR* dp] 디렉터리 스트림 구조체이다. 에 typedef struct_dirstream DIR 로 정의되어 있음 opendir("파일명") 하면 인자로 들어온 디렉토리에 대한 스트림을 생성하고 return값으로 해당 스트림 포인터를 반환하는데 이 스트림 포인터를 DIR* 변수로 받아주면 된다. 즉, DIR에는 현재 열린 디렉토리 정보가 있는 것이다. [ struct dirent ] 디렉토리 내 파일에 대한 구조체이다 struct dirent{ char d_name[256]; ino_t d_ino; unsigned char d_type; } opendir 후에 readdir하면서 파일탐색할때만 쓴다 나머지는 다 struct stat으로 한다고 보면 된다 [ struct stat ] 파일 구조체이다 ..
-
[Linux] execl() and execv()LinuxProgramming 2023. 10. 18. 19:48
execl("./a.out", "./a.out", "1", "abcde", (char*)0); char const* argv[] = {"./a.out", "0", "12345", (char*)0}; execv("./a.out", argv); 첫번째 인자인 ./a.out, 즉 실행할 파일 경로는 실행할 파일이 받는 const char** argv 로 들어가지 않는다. 그래서 argv는 두번째 인자부터 시작이다 맨 첫번째인자는 파일경로를 알려주는 것뿐이다 진짜로 전달되는 인자는 파일 경로 뒤부터다. 또한 char** argv로 받을때는 string인자들만 받기 때문에 정수를 전달할때도 string으로 전달이 된다. 그래서 해당 프로그램 안에서 정수로 바꿔줘야하는데 이때 atoi 함수를 사용할 줄 알아야한다 ..
-
[Linux] wait() and waitpid()LinuxProgramming 2023. 10. 17. 21:28
waitpid()를 배우니 기존에 배웠던 wait()에 대해 정확하게 이해하지 못하고 있다는 걸 깨달아서 작성함 [wait(int* status)] parent에서 쓰는 함수로 자신이 생성한 임의의 child process가 exit되는 것을 기다린다 임의의 자식이 종료될때까지 기다린다. 임의의 자식이 종료될때까지 blocking 상태에 있다. parent가 자신의 코드 실행을 안한다는 얘기다 어떤 자식이 종료되었으면 그제서야 parent는 다시 깨어나서 자신의 코드를 실행한다. 이 코드는 wait를 통해 종료된 child process를 받고 종료되었으면 WEXITSTATUS(status)로 받은 child process의 exit value를 추출하여 출력하는 코드이다. 중요한 것은 이 코드가 절대로..
-
[Linux] signal()LinuxProgramming 2023. 10. 16. 19:08
[ basic signal functions ] 1. kill(pid_t pid, int signo) 특정 프로세스한테 signal 보냄 2. pause() signal 올때까지 ㄱㄷ 3. raise(int signo) 자신에게 시그널 호출. 그래서 인자가 한 개이다. 다른 프로세스한테도 시그널을 호출할 수 있는 kill과 다르게 자기자신한테 호출하는 것으로 이미 정해져있는 것이기 때문이다. raise(SIGKILL); 이면 프로세스 자살임. 4. abort() 자신에게 ABORT 시그널을 보낸다. 프로세스를 비정상종료시키고 core dump file을 생성한다. [ 3 ways of signal handling] 1) SIG_DFL : 해당 시그널 오면 종료 2) SIG_IGN : 해당 시그널 무시 3..
-
[Linux] pipe()LinuxProgramming 2023. 10. 16. 00:52
가장 중요한거 1. pipe 의 가장 큰 장점은 BLOCKING을 해준다는 것(다른 말로 동기화를 지원해준다는 것) 2. pipe 는 오직 parent-child 관계에서만 사용된다. 관계없는 프로세스 사이에서 통신하려면 FIFO(mkfifo)를 사용해야함 3. BLOCKING 과 NONBLOCKING 옵션을 지원한다 [pipe 생성] int fd[2]; pipe(fd); 이러면 해당 프로세스의 input pipe 하나와 output pipe 하나가 생성됨 그리고 이때 해당 프로세스의 file descriptor table에 fd[0]과 fd[1]의 값인, 즉 새로 생성된 두 파이프 번호가 추가됨 즉 stdin, stdout, stderr 는 모든 프로세스에게 default로 제공되는 fd값들이므로 4번..