세마포어에대해 배우고있읍니다
안녕하세요
세마포어에대해 배우고있읍니다
근데 아래부분중
else if ((semid != -1) && (sem_num == 1))
{
sem_union.val = 1;
status = semctl(semid, 0, SETVAL, 1);
}
위코드에대해서 조언부탁드립니다
sem_union 이 구조체인가요 값을 1로설정한다는것이 무엇을 뜻하는것인지....
그리구
semctl(semid, 0, SETVAL, 1);
이코드로 어떤동작이 이루어지는지
조언부탁드립니다
즐거운하루되세요
// // 세마포설정을 한다.
semid = semget((key_t)SEMKEY, sem_num, 0660|IPC_CREAT);
if (semid == -1)
{
perror("semget error");
exit(0);
}
else if ((semid != -1) && (sem_num == 1))
{
sem_union.val = 1;
status = semctl(semid, 0, SETVAL, 1);
}
if ((semid == -1) || (status == -1))
{
perror("initialized sem failed");
exit(0);
}
// counter.txt 파일을 열기 위해서 세마포어검사를한다.
if(semop(semid, &mysem_open, 1) == -1)
{
perror("semop error ");
exit(0);
}
제 생각에는...
안녕하세요
이 부분은 semget함수에 key_t형인 semkey와
들어온 개수(파일 이름으로 짐작컨데.. ㅡㅡ; 이부분만 보고서는)인 sem_num
을 넘겨주어 처리를 하고, 처리 결과가 정상적으로 수행되지 않았으면 에러
발생, 프로그램 종료를 뜻합니다.
함수명이 semget인걸루 봐서는........
키값을 가져오는 함수호출이 맞는것 같은데.. 아마도
키값이 반환값으로 되돌아 오는 것이 아닌가 생각되네요...
이 코드만 가지고는 무슨 기능을 하는지 알수가 없을것 같은데요...
왜냐하면.. semctl 함수를 호출하는 기능을 가지고 있는데
semctl함수에 무슨 내용이 있는지 모르니까...^^
msdn에서 검색해 보아도 semctl이라곤 안나오니..
에러가 나지 않은 상태에서
semid 값이 -1이 아니면서 sem_num(아마도 값의 수?)가 1이면
위에서 semid값이 -1일때 의 경우를 이미 빼 놓았는데 제가 보기에는
또 들어가 있네요.. 다른 이유가 있을까요?
sem_union.val 에 1을 넣습니다.
위 값이 1이면 세마포어내로 진입할수 있는 것은... 아닌것 같은데..
파일이름으로 짐작컨데 이것은 공용체가 아닐지....
공용체는 특정 용도가 아니라 여러 곳에서 여러 용도로 쓰이는 변수일 가능성이
높다고 생각해요...
그다음 semctl함수에 상기의 값들을 넘겨주어 세마포어 stat값을 넘겨
받습니다.(파일 이름으로만 짐작컨데...^^)
처리에 필요한 내용이겠지요.
에러가 초기화 에러라고 하네요 ^^
함수에 넘겨주고 받은 값
semid와 status가 정상적으로 리턴되지 않았으면...
프로그램 종료라는 것인듯 한데...넘겨준 값들이 제대로 처리되지
않았거나 잘못된 값이 넘어갔을 경우를 말하는듯 해요 ^^
말그대로 세마포어 검사해서 정상수행이 되지 않고 -1값이 반환되면
세마포어 안열렸다고 말하고 프로그램 종료하는 것 아닌가요?
상기 코드만 보고 무슨 내용인지 잘 파악이 안되는데 ^^
혹시라도 도움이 될까 .. 해서 적어 봤습니다.
이제까지 적어오신 글들을 보면 이런 내용을 원하시는 분 같지는 않은데...
제가 착각을 하고 있는 것인지..^^
제가 뭔가 잘못 이해하고 적은 것인지도 모르겠네요
좋은 하루 되시구요~ ^^
타인을 자기 자신처럼 존경할수 있고, 자기가 하고 싶다고 생각하는 것을 타인에게 할 수 있다면, 그 사람은 참된 사랑을 알고 있는 사람이다. 그리고 세상에는 그 이상 가는 사람은 없다.
초기화 함수입니다.
msdn에서 찾는것보다 man 페이지 보시는게 빠릅니다.
semctl()은 여러용도로 사용할 수 있는데 그중에서 SETVAL 는 초기값 설정에 사용됩니다. 일반적으로 1로 설정하는데(이유는 P/V연산에 대해서 공부하심 압니다) 위의 것은 semctl(sem_id, 0, SETVAL, 1); 이 코드죠?
sem_id 는 세마포어IPC ID이고, 0은 배열인덱스를 의미합니다.
========================================
* The truth will set you free.
한번더부탁드립니다
안녕하세요
답변감사합니다
semctl(semid, 0, SETVAL, arg)
이함수의 마지막인자는 뭘의미하는것죠
프로그램실행시의 아규멘트를 나타내는것아닌가요
저는 아규멘트로 다른부분에서이용하기위해서
세마포어와는 다른의미로사용하는데여
어떻게설정을 해줘야되나요
죄송하지만 한번더부탁드립니다
즐거운하루되세요
앞서 말씀드렸듯이 세마포어 컨트롤을 위해서 사용합니다.
위에서 SETVAL의 경우는 초기값 설정용으로 사용됩니다. 이외에 다른 곳에서는 의미가 다릅니다. 사용할 수 있는 다른 명령어셋으로는 매뉴얼 페이지에서 찾아볼 수 있습니다.
참고로 semctl(sem_id, 0, SETALL, semun) 이런식으로 사용할때는 semun 공용체에 저장된 값으로 모두 초기화할 수 있죠.
========================================
* The truth will set you free.
댓글 달기