C언어 잘하시는분 ㅜㅜㅜ 정보
C언어 잘하시는분 ㅜㅜㅜ본문
첫번째 질문
리눅스 /proc/[PID]/stat 텍스트파일 내에는
1 (init) S 0 1 1 0 -1 4194560 1597 347511 89 1336 0 428 7109 3736 20 0 1 0 5 2056192 1344294967295 134512640 134636520 3218157984 3218157132 1115158 0 0 4096 671835171 0 0 0 0 0 0 0 461 0 0
이런식으로 숫자가 적혀있습니다. 위 파일은 init 프로세스의 정보이고, 리눅스 /proc/1/stat 안의 내용입니다.
stat 파일안에 있는 저 내용들은 공백 " " 을 기준으로 구분되어있습니다.
공백을 기준으로 각각을 저장해서 원하는부분을 출력하고 싶습니다.
어찌해야할까요?
두번째 질문
리눅스에 /proc이라는 디렉토리 안에는 숫자로된 디렉토리가 굉장히 많습니다.
숫자로된 디렉토리는 현재시스템에서 수행되고 있는 프로세스의 디렉토리입니다.
디렉토리명은 PID이며, 이 디렉토리의 개수는 가변적입니다.
또 디렉토리 안에는 stat 이라는 파일이 모두 있습니다.
만약 50개의 프로세스가 수행되고 있다면, 50개의 디렉토리가 있구요. 30개의 프로세스가 수행중이라면 30개의 디렉토리가 있겠지요?
이처럼 프로세스의 개수는 정해지지 않았고, 각 디렉토리 안에는 stat 이라는 파일이 모두 있습니다.이 stat 이라는 파일안에는 첫번째 질문에서 언급했듯이 프로세스 상태정보가 공백을 기준으로 적혀있습니다.
저는 이 많은 디렉토리 안에 있는 stat을 모두 읽어서, 보기좋게 정렬해서 출력하는 프로그램을 공부할겸 만들고있습니다.
그런데 stat 이 들어있는 프로세스 디렉토리는 개수가 가변적이라, 배열로 선언하게 되면 메모리를 많이 낭비하게 될듯합니다.
자칫 메모리가 부족할수도 있을것 같구요.
그래서 생각한게 자료구조에서 링크드리스트인데, 구조체를 이용하는것 같더라구요.
그런데 아무리 읽어도 이해가 가질않네요.
그 많은 디렉토리 내부의 stat을 모두 읽어서 저장한후에, 원하는 부분을 딱딱 집어서 출력하려면
대체 어떻게 저장을 해야할까요?ㅠㅠㅠㅠ
아시는분 있으면 답변 부탁드립니다.
좋은 주말보내세요!
댓글 전체
제 말은 stat 파일을 읽어와서 공백을 기준으로 파싱해서 배열로 저장하고, c 파일에서 원하는 부분을 출력한다는 말이에요 ㅠ
즉 C코드안에서 /proc/[PID]/stat 을 fopen 해서 안에 내용을 공백을 기준으로 나눈후 원하는 변수에 저장하고 싶다는 말이에요 ㅠ
/proc/pid/stat 안의 내용을 긁어오려면
먼저 디렉토리가 숫자인지 아닌지 판별하고, 안에 stat을 긁어와야해서 아래와 같이 짜봤는데요.
int get_proc_info()
{
DIR *p_dir;
struct dirent *entry = NULL;
if((p_dir = opendir("/proc")) == NULL){
perror("/proc directory open error : ");
exit(0);
}
while(entry = readdir(p_dir)) != NULL) {
if(strcmp(entry -> d_name, ".") != 0 && strcmp(entry -> d_name, "..") != 0){
sprintf(p_stat, "/proc/%s/stat", entry ->d_name);
if(access(p_stat, F_OK != 0) {
continue;
}
if(Dir_digit(entry -> d_name)){
///////////////// 이부분에서 stat 내용을 읽어와서 저장해야합니다.
}
else{
}
}
}
stat 안에 내용을 읽어와서 저장하는 함수를 따로 만들려고 하는데,
프로세스 개수가 가변적이라 배열로 저장하기엔 메모리 낭비가 심하고, 링크드리스트를 사용해야할꺼같은데, 이해가 잘안가고 해서 질문올렸습니다;
ㅠㅠㅠ
배열의 크기가 정해지지 않았을 경우
동적 할당을 해야합니다.
c의 경우에는 malloc , c++의 경우에는 new 를 사용합니다.
동적 할당은 메모리의 heap 부분을 사용하며 제대로 할당되었는지 확인하는 방법은 배열포인터 값이 NULL 인지 체크하는 것입니다.
필요한 만큼 메모리 할당받고 해제할수 있어서, 사용하려고 했던건데요 ㅠㅠㅠ
아 머리아프네요 ㅠㅠ