#include #include #include #include #include #include #include #include const char *path = "/tmp/sem.server341321"; char *buf; key_t sem_key, shm_key; struct sembuf sem; int sem_id, shm_id; void handle_error(char *txt) { perror(txt); exit(-1); } void exit_prog() { // shmdt(buf); semctl(sem_id, 0, IPC_RMID); semctl(sem_id, 1, IPC_RMID); shmctl(shm_id, IPC_RMID, NULL); unlink(path); exit(0); } int main() { sem.sem_flg = 0; signal(SIGINT, exit_prog); if (access(path, F_OK) == 0) unlink(path); if (mknod(path, 0600 | S_IFREG, 0) == -1) handle_error("mknod"); if ((sem_key = ftok(path, 0)) == -1) handle_error("ftok sem"); if ((shm_key = ftok(path, 1)) == -1) handle_error("ftok shm"); if ((sem_id = semget(sem_key, 2, 0600 | IPC_CREAT)) == -1) handle_error("semget"); if ((shm_id = shmget(shm_key, sizeof(1024), 0600 | IPC_CREAT)) == -1) handle_error("shmget"); if ((buf = shmat(shm_id, 0, 0)) == NULL) handle_error("shmat"); u_short semset[] = {1, 0}; if (semctl(sem_id, 0, SETALL, semset) == -1) handle_error("semctl set"); if (semop(sem_id, &sem, 1) == -1) handle_error("semop 1"); double d1; while (1) { { sem.sem_num = 1; sem.sem_op = -1; if (semop(sem_id, &sem, 1) == -1) handle_error("semop 1"); memcpy(&d1, buf, sizeof(double)); printf("received %f\n", d1); // sem.sem_num = 0; // sem.sem_op = 1; // if (semop(sem_id, &sem, 1) == -1) // handle_error("semop 2"); // printf("b\n"); } { // sem.sem_num = 1; // sem.sem_op = -1; // if (semop(sem_id, &sem, 1) == -1) // handle_error("semop 1"); sleep(1); d1 *= d1; memcpy(buf, &d1, sizeof(double)); printf("sent %f\n", d1); sem.sem_num = 0; sem.sem_op = 1; if (semop(sem_id, &sem, 1) == -1) handle_error("semop 2"); printf("b\n"); } } return 0; }