Ich habe ein Client-Server-Projekt mit Semaphoren. Ich laufe beide aus dem gleichen Ordner, und sie verwenden den gleichen Schlüssel. Nun möchte ich, dass der Server den Semaphor sperrt. Daher kann der Client keine Befehle ausführen, bis der Server ihn freigibt, aber der Client ignoriert die Sperre des Servers. Ich verstehe nicht, wo mein Fehler ist. Server-Code:zwei Semaphore nicht kommunizieren
#include<stdio.h>
#include<string.h>
#include<pthread.h>
#include<stdlib.h>
#include<unistd.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <signal.h>
#include <sys/shm.h>
#include <sys/stat.h>
#define FLAGS IPC_CREAT | 0644
union semun {
int val;
struct semid_ds *buf;
ushort *array; };
union semun semarg;
struct sembuf sops[1];
int main() {
semarg.val=1;
int resultsCreator=open("results.txt",O_CREAT|O_RDWR);
key_t key;
key = ftok("results.txt", 'k');
int shmid = shmget(key, 12, FLAGS);
int semfor = semget(key, 1, IPC_CREAT | IPC_EXCL | 0666);
semctl (semfor , 0 , SETVAL , semarg);
sops->sem_num = 0;
sops->sem_flg = 0;
sops->sem_op = -1;
int k = semop (semfor , sops , 1); //lock the semaphore
char* shmaddr;
int numWaiting =0;
while(1){
sleep(2); //CHECK EVERY 2 SECONDS IF SOMEONE IS WAITING
numWaiting = semctl(semfor, 0, GETNCNT, semarg);
if(numWaiting==0){
printf("none waiting\n");
continue; }
printf("more than one waiter\n"); //NEVER GETS HERE
} //END WHILE
Client-Code:
#include<stdio.h>
#include<string.h>
#include<pthread.h>
#include<stdlib.h>
#include<unistd.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <signal.h>
#include <sys/shm.h>
#include <sys/stat.h>
#define FLAGS IPC_CREAT | 0644
union semun {
int val;
struct semid_ds *buf;
ushort *array;
};
union semun semarg;
struct sembuf sops[1];
int main()
{
key_t key;
key = ftok("results.txt", 'k');
int shmid = shmget(key, 12, FLAGS);
semarg.val=1;
int semfor = semget(key, 0, 0666);
semctl (semfor , 0 , SETVAL , semarg);
sops->sem_num = 0;
sops->sem_flg = 0;
sops->sem_op = -1;
semop (semfor , sops , 1);
printf("skipped lock\n"); //PRINTS IT, EVEN WHEN IT'S STILL LOCKED
sops->sem_op = 1;
semop (semfor , sops , 1);
return 0;
}
warum der Client die Semaphore Sperre des Servers ignorieren?
Vermisst der echte Code auch eine Fehlerüberprüfung? – alk
/Ich löschte einige nicht wichtige Teil, um es so kurz wie möglich zu machen, aber mein Code hat keine Fehler, ich zeigte hier genau, was es druckt –
* Ich löschte einige nicht wichtige Teil * Wenn Sie nicht wissen, warum es nicht ist arbeiten, können Sie nicht wissen, welche Teile unwichtig sind. Drucken Sie den Rückgabewert von 'semget()' - jedes Mal, wenn Sie es ausführen. –