프로세스 목록 보기
- ps : 현재 실행중인 프로세스 목록 보기 (로그인한 id 상태에서 돌고 있는 프로세스)
- -ef 옵션 : 서버에서 사용중인 전체 프로세스 보기
ps -ef | more
ps -ef | grep 학번 -> 내 프로세스만 보고 싶을 때 - top : CPU, swap, ... 확인 가능
- zombit : 자식 process의 부모 process가 존재하지 않을 때
프로세스 식별 - getpid, getppid
#include <unistd.h>
pid_t getpid(void); //함수 호출한 프로세스의 PID 리턴
pid_t getppid(void); //부모 프로세스의 PID 리턴, 바뀌지 않음
프로세스 그룹
- 관련 있는 프로세스 묶은 것으로 PGID(프로세스 그룹 ID)가 부여됨
- 프로세스 그룹 리더
- 그룹 구성하는 프로세스 중 하나가 리더 됨
- 그룹 리더의 PID가 PGID
- 변경 가능함
- 그룹에 프로세스 1개일 때 그 프로세스가 리더가 됨
- 검색 - getpgrp, getpgid
- 변경 - setpgid
#include <unistd.h>
#include <sys/types.h>
pid_t getpgrp(void);
pid_t getpgid(pid_t pid);
//pid 인자로 지정된 프로세스의 그룹 id return
//인자가 0이면 getpgid 함수 호출한 프로세스가 속한 그룹의 pgid 리턴
int setpgid(pid_t pid, pid_t pgid);
int main(){
printf("PID : %d\n", (int)getpid()); //실행시킨 process ID
printf("PGRP : %d\n", (int)getpgrp()); //process의 group ID
printf("PGID(0) : %d\n", (int)getpgid(0)); //인자 없으면 process가 속한 group ID
printf("PGID : %d\n", (int)getpgid(getpid()));
}
환경변수
- 프로세스 실행되는 기본 환경 설정하는 변수
- 로그인명, 로그인 쉘, 터미널에 설정된 언어, 경로명 등
- 대문자로 사용, 환경변수 = 값 형태
- env : 현재 쉘의 환경 설정 보기
- echo $PATH : path만 볼 수 있음
환경변수 사용
전역변수 사용 - environ
#include <stdlib.h>
extern char **environ;
int main(){
char **env;
env = environ;
while(env){
printf("%s\n",*env);
env++;
}
}
main 함수 인자 사용
#include <stdio.h>
int main(int argc, char **argv, char **envp){
char **env;
env = envp;
while(*env){
print
env++;
}
}
환경변수 검색, 설정, 삭제 - getenv, setenv, putenv, unsetenv
#include <stdlib.h>
char *getenv(const char *name); //환경변수 중 어떤거 볼 지 정해야 함
int putenv(char *string); //환경변수 값 다른 값으로 바꾸기, process 수행 동안에만 바뀜
int setenv(const char *envname, const char *envval, int overwrite);
int unsetenv(const char *name);
int main(){
char *val;
val = getenv("SHELL");
if (val == NULL)
printf("SHELL not defined\n");
else
printf("SHELL = %s\n", val);
setenv("SHELL", "/usr/bin/csh", 0); //환경변수 덮어쓰기 안됨
val = getenv("SHELL");
printf("2. SHELL = %s\n", val);
setenv("SHELL", "/usr/bin/csh", 1); //환경변수 덮어쓰기 됨
val = getenv("SHELL");
printf("3. SHELL = %s\n", val);
}
디렉토리 트리 산책 - ftw (많이 사용됨)
- 주어진 디렉토리부터 출발해 그 디렉토리 아래의 모든 파일, 부 디렉토리에 대한 작업 수행함
int ftw(const char *path, int (*func)(), int depth);
int func(const char *name, const struct stat *sptr, int type);
- int depth : 일반적으로 1로 설정함
- type
- FTW_F : 객체가 하나의 파일
- FTW_D : 객체가 하나의 디렉토리
- FTW_DNR : 객제가 읽을 수 없는 하나의 디렉토리 == error
- FTW_SL : 객체가 하나의 심볼형 링크
- FTW_NS : 객체가 심볼형 링크 아님 -> stat 루틴이 성공적으로 수행될 수 없는 객체
- 산책 끝나는 경우
- leaf에 도달
- ftw에서 오류 발생 -> -1 return
- 사용자가 정의한 함수가 0이 아닌 값 돌려주면 종료, ftw는 수행 그치고 사용자 함수에 의해 복귀된 값 return
#include <sys/stat.h>
#include <ftw.h>
#include <stdlib.h>
#include <stdio.h>
int list(const char *name, const struct stat *status, int type)
{
if (type == FTW_NS) return 0;
if (type == FTW_F)
printf("% - 30s\t0%3o\n", name, status->st_mode&0777);
else
printf("% - 30s*\t0%3o\n", name, status->st_mode&0777);
return(0);
}
main(int argc, char **argv) {
int list(const char *, const struct stat *, int);
if (argc == 1)
ftw(".", list, 1);
else
ftw(argv[1], list, 1);
exit(0);
}