프로그래밍

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
무분별한 사용은 차단될 수 있습니다.
번호 제목 글쓴이 추천 수 날짜 조회 수
180896 [잡담] 갤탭s9 fe+ 가격 괜찮음? 좃같은건못참음 0 7 분 전 3
180895 [견적] 와이프 결재 올리기 전 스펙 봐주세오 1 흐린눈 0 14 분 전 13
180894 [프로그래밍] Aws 람다에 파이썬 올려서 결과 받아오는데 4 아르피쥐 0 2 시간 전 104
180893 [잡담] 맥 업그레이드 하면 어도비 오류좀 줄어들까?? fhana 0 4 시간 전 38
180892 [컴퓨터] 아오 14900k 진짜 문제 있는거임? 15 너가전부옳아 0 8 시간 전 233
180891 [컴퓨터] 아수스 글카 as 어떰요? 5 광어우럭따 0 10 시간 전 134
180890 [컴퓨터] 이정도사양이면 팰월드풀옵션할수있나요? 3 정신이상함 0 10 시간 전 119
180889 [컴퓨터] 쉐도우플레이 버그 1 Mtrap 0 11 시간 전 46
180888 [잡담] 책상 다 꾸몄당 6 로스앤젤리스요정 1 11 시간 전 144
180887 [잡담] 독거미 F87 Pro 도착 2 필립스 0 12 시간 전 179
180886 [잡담] 직구 어캐 됐어여?? 15 뀨르륵륵 0 12 시간 전 142
180885 [컴퓨터] cpu만 바꿀지 중고컴 적당한 거 구매할지 고민중인데 뭐가 나... 7 IlIllllIlllI 0 13 시간 전 100
180884 [견적] 조립PC 견적 봐주세요.. 4 하몽 0 13 시간 전 88
180883 [컴퓨터] F99 독거미 그레이축 후기 2 가닥인생 0 15 시간 전 202
180882 [정보] 갤럭시탭s9 fe+ 가격 괜차나? 5 좃같은건못참음 0 16 시간 전 154
180881 [모바일] ios 잘 아는 개붕님 계신가요 5 바른자세 0 16 시간 전 179
180880 [잡담] 내일 웨스톤 오디오 마하60, 슈어 SE846 GEN2 청음하러 간다 ... 3 참잘했어요 0 16 시간 전 34
180879 [컴퓨터] 혹시 유튜브 홈화면 안나오는거 해결방법 아시는 분 계신가요 5 3541201 0 16 시간 전 83
180878 [컴퓨터] 노트북삿워요요 3 숨겨왔던너의 0 16 시간 전 70
180877 [모바일] 다시 아이폰으로 돌아가야하나?.... 노보케인 0 17 시간 전 127