C언어 잘하시는분 ㅜㅜㅜ > 십년전오늘

십년전오늘

10년전 추억의 책장을 넘기며

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 134
4294967295 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 인지 체크하는 것입니다.
링크드리스트가 실행시 필요에 의해 메모리를 동적으로 할당받는거 아닌가요?
필요한 만큼 메모리 할당받고 해제할수 있어서, 사용하려고 했던건데요 ㅠㅠㅠ
아 머리아프네요 ㅠㅠ
전체 121
십년전오늘 내용 검색

회원로그인

진행중 포인트경매

  1. 참여4 회 시작24.04.25 20:23 종료24.05.02 20:23
(주)에스아이알소프트 / 대표:홍석명 / (06211) 서울특별시 강남구 역삼동 707-34 한신인터밸리24 서관 1404호 / E-Mail: admin@sir.kr
사업자등록번호: 217-81-36347 / 통신판매업신고번호:2014-서울강남-02098호 / 개인정보보호책임자:김민섭(minsup@sir.kr)
© SIRSOFT