Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <sys/types.h>
- #include <sys/ipc.h>
- #include <sys/sem.h>
- #include <semaphore.h>
- #include <sys/shm.h>
- #include <fcntl.h>
- #include <string.h>
- #include <sys/stat.h>
- #include <unistd.h>
- #include <stdio.h>
- #include <errno.h>
- #include "semadefs.h"
- int main(int argc, char* argv[]){
- int fd_read_file;
- if (argc < 2){
- fprintf(stderr, "No address of file.\n");
- return 1;
- }
- int file_index = 1;
- if ((strcmp(argv[1], "-h") == 0)){
- printf("Usage: [key] <filename>.\nKeys:\n-h: show this help.\n-i: ignore another running client.\n");
- return 0;
- }
- else if (strcmp(argv[1], "-i") == 0){
- if (argc < 3){
- fprintf(stderr, "No address of file.\n");
- return 1;
- }
- file_index = 2;
- if (remove("/dev/shm/sem.clientlock") < 0){ //delete semaphore semaphore
- if (errno == ENOENT){}
- else {
- perror("");
- return 1;
- }
- }
- }
- Message *message_ptr;
- key_t key;
- sem_t* sem_blocker;
- int shmem_id, sem_proc_id, semval;
- int n_reader = -1;
- fd_read_file = open(argv[file_index], O_RDONLY);
- //open given file
- if (fd_read_file < 0) {
- perror("An error occured while trying to open file");
- return 1;
- }
- //generate key
- if ((key = ftok(shfname, 'A')) < 0){
- fprintf (stderr, "Server wasn't runned\n");
- return 1;
- }
- //getting memory id
- if ((shmem_id = shmget(key, sizeof(Message), IPC_CREAT | 0666)) < 0){
- perror("Cannot create shared memory space");
- return 1;
- }
- //attaching memory
- if ((message_ptr = (Message *)shmat(shmem_id, 0, 0)) < 0){
- perror("Cannot attach shared memory");
- return 1;
- }
- //getting semaphores
- if ((sem_proc_id = semget(key, 1, IPC_CREAT | 0666)) < 0){
- perror("An error occured while accessing semaphore");
- return 1;
- }
- //get blocker semaphore
- if ((sem_blocker = sem_open("/clientlock", O_CREAT, IPC_CREAT | 0666, 0)) == SEM_FAILED){
- perror ("An error occured while creating locker semaphore");
- return 1;
- }
- //check locks from another clients
- if (sem_getvalue(sem_blocker, &semval) < 0){
- perror ("An error occured while accessing semaphore");
- }
- if (semval > 0){
- fprintf(stderr, "Another client is running.\n");
- return 1;
- }
- //set lock from another clients
- if (sem_post(sem_blocker) < 0){
- perror("An error occured while doing semaphore operation");
- return 1;
- }
- while (n_reader!=0){
- //wait for unlocking, then lock memory
- if (semop(sem_proc_id, &client_start, 1) < 0){
- perror("An error occured while doing semaphore operation");
- return 1;
- }
- if ((n_reader = read(fd_read_file, message_ptr->buff, BUF_SIZE)) < 0){
- perror("An error occured while reading to shared memory");
- return 1;
- }
- message_ptr->size = n_reader;
- //unlock memory
- if (semop(sem_proc_id, &client_end, 1) < 0){
- perror("An error occured while doing semaphore operation");
- return 1;
- }
- }
- //detatch from memory
- if (shmdt(message_ptr) < 0){
- perror("Message error");
- return 1;
- }
- if (sem_close(sem_blocker) < 0){
- perror ("Semaphore destroying error");
- return 1;
- }
- if (remove("/dev/shm/sem.clientlock") < 0){
- perror("Semaphore destroying error");
- return 1;
- }
- //and successfully return
- return 0;
- }
Add Comment
Please, Sign In to add comment