프로그래밍

c랑 리눅스 고수님들 질문입니다

bin파일로부터 프로세스 정보와 코드 정보를 불러와서 리눅스 list.h 자료구조를 이용해서 프로세스 리스트를 만들고 출력하는 문제입니다. 
몇가지 케이스 에서는 출력이 제대로 되는데 몇가지 케이스는 오답이거나 런타임 에러가 납니다. 

 

pid 0,1에서는 제대로 되는데 2의 코드정보가 이상하게 출력됩니다. 아무래도 파싱과정에 문제가 있나 해서 바꿔봤는데 그러면 더 이상해지고 나머지는 되는데 왜 2번프로세스만 문제인지 모르겠어요. 
그리고 런타임 에러는 동적할당의 문제가 있는것 같아서 할당방법을 고쳐보고 free위치를 바꿔보고 했는데 Segmentation fault에러가 뜨네요.

pid 2번 부분만 문제가 있으니까 이해가 안됩니다.

 

bandicam 2021-04-12 19-45-38-846.jpg

 

bandicam 2021-04-13 16-49-42-126.jpg

 

34개의 댓글

2021.04.13

fread(cur, sizeof(int)*3, stdin);

 

이거하면 cur에 뭐가 들어감?

0
2021.04.13
@숨은음은

pid, arrival_time,code_bytes 가 들어갑니다 int형 3개씩 구조체에 저장해요

0
2021.04.13
@wantop

자동으로 cur에 있는 세 변수에

stdin이 넣어준다고?

어디에 넣어준다는 말도 없는데?

0
2021.04.13
@숨은음은

이진파일이 int형 3개 코드정보 int형 3개 코드정보...... 이런식으로 되어있고 while 문에 있는 fread가 정보를 읽어서 cur에 저장해요

0
2021.04.13
@wantop

신기하긴 하네 안 써봐가지고

 

근데 그러면 밑에 있는

 

fread(cur->operations, sizeof(code), cur->code_bytes / 2, stdin);

 

한 줄만으로 for문 동작이 다 돌아갈 거 같은데 왜 굳이 저렇게 for문을 돌렸음?

0
2021.04.13
@숨은음은

fread로 한 프로세스의 정보를 읽어온 후 프로세스의 code_bytes만큼 코드 구조체를 불러와야해요 각 프로세스마다 code_bytes가 달라서 그때 마다 동적할당을 한거에요

0
2021.04.13
@wantop

그니까 오퍼레이션은 동적할당하면 되는데

불러올 데이터 개수는 알 수 있으니까

저렇게 fread 쓸 수 있는 거 같은데?

저렇게 써봤음?

0
2021.04.13
@숨은음은

for문을 지우고 fread로 cur->operations에 code단위로 cur->code_bytes만큼 읽어오는 걸 말씀하시는 거죠? 해봤는데 프로세스 하나만 읽히고 그 마저도 제대로 안 읽혀요

0
2021.04.13
@wantop

읭 뭐지

 

그럼 for문은 두고

 

fread(&(cur->operations[i]), sizeof(code), 1, stdin);

은?

0
2021.04.13
@숨은음은

값이 읽히긴 하는데 안되는 케이스는 여전히 다르게 출력됩니다

0
2021.04.13
@wantop

프로세스 안에 있는 list_head는 뭐야?

0
2021.04.13
@숨은음은

list_head는 연결리스트에 사용됩니다. prev, next 접근할 수 있게 구조체 안에다가 넣어서 사용해요 전체적인 동작이 bin파일로부터 프로세스 정보 읽어오기- 바이트 만큼의 코드 튜플을 불러오기- 이 정보를 job이라는 연결리스트에 저장- 각 리스트를 순회하며 정보 출력- 리스트 삭제하고 동적할당 해제 입니다

0
2021.04.13
@wantop

근데 굳이 양방향 연결리스트일 필요가 있음?

너가 쓰는 리스트는 단방향이어도 전혀 상관없어보이는데;

0
2021.04.13
@숨은음은

이 자료구조를 그냥 불러와서 사용하는 거라서요 next가 있어야 list_for_each_entry_safe_reverse를 사용할 수 있어요 next가 삭제할 때 사용된다네요

0
2021.04.13
@wantop

아 그렇구나

우선 입력할 때도 잘 입력되는지 출력 돌려보자

cur에 정상적인 값이 삽입되고 있는지

0
2021.04.13
@숨은음은

일단 프로세스 정보 int 형 3개는 항상 잘 입력되고 출력됩니다. 다른프로세스는 괜찮은데 마지막 프로세스의 정보가 이상하게 입력되네요. 코드정보가 0 0 이렇게 무한루프 돌때도 있고

0
2021.04.13
@wantop

거봐 입력 받아오는게 이상하네;

입력을 fread말고 다른 방식으로 읽어오면 안되는거야?

fscanf라던가 다른 것도 있잖아

0
2021.04.13
@숨은음은

과제의 힌트에서 fread를 사용 하길래 이걸로 했어요 근데 왜 마지막만 그런지 모르겠네요 ㅠㅠ

0
2021.04.13
@wantop

난 비주얼만 써가지고 내가 코드를 쳐보고 왜 안 되는지 설명해주기가 힘드네;;

0
2021.04.13
@숨은음은

bin 파일 정보를 알려드릴까요

0
2021.04.13
@wantop

아 그게 아니라 list.h를 못써서 ㅋㅋ gcc에는 있는 라이브러리 같은데 비주얼은 그 라이브러리가 없어 ㅋㅋ

0
2021.04.13
@숨은음은

아 맞네요 답변 정말 감사합니다 어떻게든 해결해야겠네요

0
2021.04.13
@wantop

해결을 못해줘서 미안하다 ㅋㅋ;; 리눅스 환경은 대학 다닐 때만 써가지고(학교 서버)

지금은 리눅스 접속이 안돼 ㅠㅠ

0
2021.04.13
@숨은음은

아닙니다 해결되면 뭐 때문인지 말씀드릴게요

0
2021.04.13
@wantop
0
2021.04.13
@숨은음은

해결했습니다 ㅠㅠ

0
2021.04.13

cur++가 원인인 것 같은데

0
2021.04.13
@티벳여우

cur++ 을 어떻게 바꿔야할까요? 저도 이게 문제가 아닐까 했는데 이걸 안하면 Segmentation fault 뜹니다

0
2021.04.13
@wantop

cur++를 cur = (process*)malloc(sizeof(process)); 로 바꿔보셈

0
2021.04.13
@티벳여우

형님;; 이게 문제였네요 아 왜 연속된 주소에 넣어야 한다고 생각했는지 ㅠㅠ 감사합니다 존경합니다

0
2021.04.13
@wantop

그리고 메모리 해제는

 

list_for_each_entry_safe 문 안에서

 

list_del(&cur->job);

free(cur->operations);

free(cur);

 

이렇게 해주는게 맞는듯

마지막에 free(cur) 한번 한다고 동적할당 됐었던 process 구조체들이 다같이 사라지는건 아니니까

0
2021.04.13
@티벳여우

아 그것도 맞습니다 제가 했던 코드에서는 그게 안되었거든요 진짜 감사합니다 형님

0
2021.04.14

제 답변이 도움이 될지는 모르겠지만

malloc 하고 free는 항상 짝을 맞춰 주세요~~

그리고 나중에 gdb 라던지 디버거도 사용하시면 금방 원인을 파악하실 수 있을 거에요~

0
2021.04.16
@렙의초심자

감사합니다 제가 근본없는 비전공자에 리눅스 경험도 없이 수업을 들어서 푸는데에만 급급했는데 저도 이번에 디버깅 하면서 해야겠다고 느꼈어요

0
무분별한 사용은 차단될 수 있습니다.
번호 제목 글쓴이 추천 수 날짜 조회 수
180666 [컴퓨터] 윈도우 11 구매하려고하는데 1 바나나사탕 0 33 분 전 21
180665 [컴퓨터] 이정도 스펙이면 4k 게임 잘 돌아갈까? 2 뽀삐뽀삐 0 2 시간 전 49
180664 [컴퓨터] SSD를 마이그레이션 떴는데 부팅 선택이 안됨 2 참치는동원 0 7 시간 전 61
180663 [컴퓨터] 이제 논KCPU는 기본쿨러+HB보드로만 조립해야할듯 Vv연옥의사신vV 0 7 시간 전 96
180662 [컴퓨터] 중국 모니터 살까 생각중임 5 너가전부옳아 0 9 시간 전 136
180661 [컴퓨터] 얼마전에 고장나서 다 뒤집어깠다던 개붕이인데 1 밀실심사 0 9 시간 전 114
180660 [잡담] 15일에 ㄷㄱㄷㄱ 첫조립 해야지 1 함박눈 0 10 시간 전 68
180659 [잡담] 스피커 소리가 안ㄴ남 ㅜㅜ 도움!! 匠人 0 10 시간 전 42
180658 [컴퓨터] 5700x3D가 작업에서 그리 못써먹을정돈가?? 5 포츈아그렇구나 0 11 시간 전 199
180657 [컴퓨터] 애플 매직트랙패드 이거 재밌다 4 해날 0 12 시간 전 145
180656 [컴퓨터] 컴터 업글 질문좀 받아줘 5 lake 0 13 시간 전 69
180655 [컴퓨터] 유튜브 재생 버벅임/렉 문제 개인해결함 6 GLaDOS 0 14 시간 전 130
180654 [잡담] 스위치2 나오면 사려는데 7 00원짜리 0 14 시간 전 136
180653 [잡담] 배틀메이지랑 셀레스티얼 연기루머 뭐임ㅋㅋㅋㅋㅋㅋㅋ 3 Gargantua 1 15 시간 전 71
180652 [컴퓨터] 노트북 선택좀 도와주세요! 2 두부는초장에찍먹 0 16 시간 전 90
180651 [모바일] 이심에서 유심으로 이식하는거 좀 아는 사람 있음까.. 6 ULTEGRA 0 17 시간 전 91
180650 [잡담] 시놀로지 223j랑 베스테이션이랑 뭐가 더 좋음?? 10 고민된다여 0 19 시간 전 94
180649 [컴퓨터] 2.5 SSD -> M.2 체감됨? 13 스피오스피오스피... 0 19 시간 전 264
180648 [모바일] 아이폰16 VS SE4 + 워치 6 누군가는해야하잖아 0 20 시간 전 219
180647 [컴퓨터] 형님들 급함!! 기존 HDD사용중 SDD추가 할려는데 윈도우 2 아응에 0 20 시간 전 93