bin파일로부터 프로세스 정보와 코드 정보를 불러와서 리눅스 list.h 자료구조를 이용해서 프로세스 리스트를 만들고 출력하는 문제입니다. 몇가지 케이스 에서는 출력이 제대로 되는데 몇가지 케이스는 오답이거나 런타임 에러가 납니다.
pid 0,1에서는 제대로 되는데 2의 코드정보가 이상하게 출력됩니다. 아무래도 파싱과정에 문제가 있나 해서 바꿔봤는데 그러면 더 이상해지고 나머지는 되는데 왜 2번프로세스만 문제인지 모르겠어요.
그리고 런타임 에러는 동적할당의 문제가 있는것 같아서 할당방법을 고쳐보고 free위치를 바꿔보고 했는데 Segmentation fault에러가 뜨네요.
pid 2번 부분만 문제가 있으니까 이해가 안됩니다.
34개의 댓글
무분별한 사용은 차단될 수 있습니다.
숨은음은
fread(cur, sizeof(int)*3, stdin);
이거하면 cur에 뭐가 들어감?
wantop
pid, arrival_time,code_bytes 가 들어갑니다 int형 3개씩 구조체에 저장해요
숨은음은
자동으로 cur에 있는 세 변수에
stdin이 넣어준다고?
어디에 넣어준다는 말도 없는데?
wantop
이진파일이 int형 3개 코드정보 int형 3개 코드정보...... 이런식으로 되어있고 while 문에 있는 fread가 정보를 읽어서 cur에 저장해요
숨은음은
신기하긴 하네 안 써봐가지고
근데 그러면 밑에 있는
fread(cur->operations, sizeof(code), cur->code_bytes / 2, stdin);
한 줄만으로 for문 동작이 다 돌아갈 거 같은데 왜 굳이 저렇게 for문을 돌렸음?
wantop
fread로 한 프로세스의 정보를 읽어온 후 프로세스의 code_bytes만큼 코드 구조체를 불러와야해요 각 프로세스마다 code_bytes가 달라서 그때 마다 동적할당을 한거에요
숨은음은
그니까 오퍼레이션은 동적할당하면 되는데
불러올 데이터 개수는 알 수 있으니까
저렇게 fread 쓸 수 있는 거 같은데?
저렇게 써봤음?
wantop
for문을 지우고 fread로 cur->operations에 code단위로 cur->code_bytes만큼 읽어오는 걸 말씀하시는 거죠? 해봤는데 프로세스 하나만 읽히고 그 마저도 제대로 안 읽혀요
숨은음은
읭 뭐지
그럼 for문은 두고
fread(&(cur->operations[i]), sizeof(code), 1, stdin);
은?
wantop
값이 읽히긴 하는데 안되는 케이스는 여전히 다르게 출력됩니다
숨은음은
프로세스 안에 있는 list_head는 뭐야?
wantop
list_head는 연결리스트에 사용됩니다. prev, next 접근할 수 있게 구조체 안에다가 넣어서 사용해요 전체적인 동작이 bin파일로부터 프로세스 정보 읽어오기- 바이트 만큼의 코드 튜플을 불러오기- 이 정보를 job이라는 연결리스트에 저장- 각 리스트를 순회하며 정보 출력- 리스트 삭제하고 동적할당 해제 입니다
숨은음은
근데 굳이 양방향 연결리스트일 필요가 있음?
너가 쓰는 리스트는 단방향이어도 전혀 상관없어보이는데;
wantop
이 자료구조를 그냥 불러와서 사용하는 거라서요 next가 있어야 list_for_each_entry_safe_reverse를 사용할 수 있어요 next가 삭제할 때 사용된다네요
숨은음은
아 그렇구나
우선 입력할 때도 잘 입력되는지 출력 돌려보자
cur에 정상적인 값이 삽입되고 있는지
wantop
일단 프로세스 정보 int 형 3개는 항상 잘 입력되고 출력됩니다. 다른프로세스는 괜찮은데 마지막 프로세스의 정보가 이상하게 입력되네요. 코드정보가 0 0 이렇게 무한루프 돌때도 있고
숨은음은
거봐 입력 받아오는게 이상하네;
입력을 fread말고 다른 방식으로 읽어오면 안되는거야?
fscanf라던가 다른 것도 있잖아
wantop
과제의 힌트에서 fread를 사용 하길래 이걸로 했어요 근데 왜 마지막만 그런지 모르겠네요 ㅠㅠ
숨은음은
난 비주얼만 써가지고 내가 코드를 쳐보고 왜 안 되는지 설명해주기가 힘드네;;
wantop
bin 파일 정보를 알려드릴까요
숨은음은
아 그게 아니라 list.h를 못써서 ㅋㅋ gcc에는 있는 라이브러리 같은데 비주얼은 그 라이브러리가 없어 ㅋㅋ
wantop
아 맞네요 답변 정말 감사합니다 어떻게든 해결해야겠네요
숨은음은
해결을 못해줘서 미안하다 ㅋㅋ;; 리눅스 환경은 대학 다닐 때만 써가지고(학교 서버)
지금은 리눅스 접속이 안돼 ㅠㅠ
wantop
아닙니다 해결되면 뭐 때문인지 말씀드릴게요
숨은음은
wantop
해결했습니다 ㅠㅠ
티벳여우
cur++가 원인인 것 같은데
wantop
cur++ 을 어떻게 바꿔야할까요? 저도 이게 문제가 아닐까 했는데 이걸 안하면 Segmentation fault 뜹니다
티벳여우
cur++를 cur = (process*)malloc(sizeof(process)); 로 바꿔보셈
wantop
형님;; 이게 문제였네요 아 왜 연속된 주소에 넣어야 한다고 생각했는지 ㅠㅠ 감사합니다 존경합니다
티벳여우
그리고 메모리 해제는
list_for_each_entry_safe 문 안에서
list_del(&cur->job);
free(cur->operations);
free(cur);
이렇게 해주는게 맞는듯
마지막에 free(cur) 한번 한다고 동적할당 됐었던 process 구조체들이 다같이 사라지는건 아니니까
wantop
아 그것도 맞습니다 제가 했던 코드에서는 그게 안되었거든요 진짜 감사합니다 형님
렙의초심자
제 답변이 도움이 될지는 모르겠지만
malloc 하고 free는 항상 짝을 맞춰 주세요~~
그리고 나중에 gdb 라던지 디버거도 사용하시면 금방 원인을 파악하실 수 있을 거에요~
wantop
감사합니다 제가 근본없는 비전공자에 리눅스 경험도 없이 수업을 들어서 푸는데에만 급급했는데 저도 이번에 디버깅 하면서 해야겠다고 느꼈어요