2017-12-05 1 views
0

이미 정의한 공유 메모리에 쓰는 프로세스 수가 다릅니다. 시스템 V 세마포를 사용하여 노력하고있어. 세마포어 (sem_access가) 1세마포를 통해 공유 메모리에 액세스하십시오.

sem_access.sem_op = -1; 
    semop(sem_access_id, &sem_access, 1); 

    info->index++; 
    printf ("INDEX= %d\n", info->index); 

    sem_access.sem_op = 1; 
    semop(sem_access_id, &sem_access, 1); 

문제에 초기화는 것을 항상 printf 인쇄 같은 수의 인덱스를 증가하지 않고. 추신 : 나쁜 영어로 죄송합니다.하지만 스페인어입니다. 편집 : sleep(1)을 삽입하면 제대로 작동하지만 실제로는 잠을 자고 싶지 않습니다.

+0

'semop()'호출의 반환 값은 무엇입니까? 너는 그것을 무시하고있다. –

+0

0을 반환하고 오류가 발생하지 않습니다. –

답변

0

코드에 대한 추가 정보를 제공하십시오. 무슨 문제가 있습니까? 리소스가 확보되거나 대기하지 않으면 프로세스가 멈추게됩니까? semop()

매뉴얼 페이지 말한다 : less than zero입니다

1) sem_op 경우, 프로세스가 semaphore set에 대한 ALTER 권한이 있어야합니다. 따라서 sem_access.sem_op = -1; 다른 프로세스가이 값을 0 이상으로 만들면이 프로세스 만 공유 리소스에 액세스합니다.

과정 1 : sem_access.sem_op = -1;는 //이 과정은 사실이 아니다 조건이 될 때까지 기다립니다

과정이 : 1 과정에서 sem_op 값이 -1이기 때문에,이 과정이 0으로 sem_op 값을 만들 필요가있다 1 만 다른 프로세스가 실행, 그래서 sem_op은 양의 정수 경우의 semop의 man 페이지()라고 등이

sem_access.sem_op = 1; 

좋아한다 얻을 것이다 작업이 01을 추가의 값은 세마포 값 (semval)입니다. 이제 sem_op은 -1 + 1 = 0이됩니다. 다시 참조하십시오. semop() 맨 페이지 "이것은"wait-for-zero "작업입니다 : semval이 0이면 즉시 작업을 진행할 수 있습니다."

문제를 해결할 수있는 아이디어가 있기를 바랍니다.

+0

프로세스가 제대로 실행되지만 변수 인덱스가 잘 증가하지 않습니다. 증가 전 또는 후에 sleep()을 삽입하면 잘 작동합니다. –

+0

@JimBelushi sleep이 스케줄링을위한 올바른 해결책이 아니므로, semctl()을 사용하거나 수동으로 semval 값을 0으로 만들었습니까? – achal

+0

올바르지 않습니다. 프로세스는 세마포어를 하나씩 실행 한 후 코드를 실행하므로 세마포가 올바르게 작동하지만 변수 인덱스가 올바르게 업데이트되지 않습니다. –

관련 문제