Advertisement
Guest User

Untitled

a guest
Mar 23rd, 2019
101
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.09 KB | None | 0 0
  1. //Программе в качестве единственного аргумента передается имя файла разделяемой библиотеки.
  2. //Программа должна создать именованный разделяемый сегмент памяти, и поместить в него структуру:
  3. //typedef struct {
  4.     //sem_t request_ready;  // начальное значение 0
  5.     //sem_t response_ready; // начальное значение 0
  6.     //char func_name[20];
  7.     //double value;
  8.     //double result;
  9. //} shared_data_t;
  10. //После инициализации структуры и готовности к взаимодействию - вывести на стандартный поток вывода имя разделяемого сегмента памяти POSIX для начала взаимодействия. При использовании высокоуровневых функций необходимо использовать fflush.
  11. //Взаимодействие заключается в выполнении некоторой функции с заданным именем func_name с единственным аргументом value и сохранением результата в result.
  12. //Когда противоположная сторона сформировала запрос, то разблокируется семафор request_ready. При готовности результата вычисления реализованной программой необходимо разблокировать семафор response_ready.
  13. //Признаком завершения взаимодействия считается пустое имя функции.
  14. //Используйте уникальные имена разделяемых сегментов памяти, например, используя в качестве части имени свой логин в ejudge.
  15. //Не забывайте удалять за собой используемые ресурсы.
  16.  
  17. #include <semaphore.h>
  18. #include <stdio.h>
  19. #include <string.h>
  20. #include <stdlib.h>
  21. #include <unistd.h>
  22. #include <limits.h>
  23. #include <fcntl.h>
  24. #include <sys/stat.h>
  25. #include <sys/types.h>
  26. #include <sys/mman.h>
  27. #include <errno.h>
  28. #include <dlfcn.h>
  29.  
  30. typedef struct {
  31.     sem_t request_ready;  // начальное значение 0
  32.     sem_t response_ready; // начальное значение 0
  33.     char func_name[20];
  34.     double value;
  35.     double result;
  36. } shared_data_t;
  37.  
  38. char* itoa(int val, int base){
  39.     static char buf[4] = {0};
  40.     int i = 30;
  41.     for(; val && i ; --i, val /= base)
  42.         buf[i] = "0123456789abcdef"[val % base];
  43.     return &buf[i+1];  
  44. }
  45.  
  46. int main(int argc, char* argv[]) {
  47.     int random_number = rand()%1999;
  48.     char buffer[4];
  49.     char shared_memory[NAME_MAX];
  50.     strncat(shared_memory, "/winsold_", 10);
  51.     strncat(shared_memory, argv[2], sizeof(shared_memory));
  52.     strncpy(buffer, itoa(random_number, 10), sizeof(buffer));
  53.     strncat(shared_memory, buffer, 4);
  54.    
  55.     fflush(stdout);
  56.     printf("%s", shared_memory);
  57.    
  58.     int shm_id = shm_open(shared_memory, O_RDWR|O_CREAT, 0);
  59.     ftruncate(shm_id, sizeof(shared_data_t));
  60.     shared_data_t* semaphoric_coop = mmap (NULL, sizeof(shared_data_t),
  61.                                            PROT_READ|PROT_WRITE,
  62.                                            MAP_SHARED,
  63.                                            shm_id, 0);
  64.     close(shm_id);
  65.     while(sem_trywait(&semaphoric_coop->request_ready)){}
  66.     sem_init(&semaphoric_coop->response_ready, 1, 0);
  67.     while (strcmp(semaphoric_coop->func_name, "")) {
  68.        
  69.         sem_wait(&semaphoric_coop->response_ready);
  70.         void *exec_func;
  71.         double (*ret_func) (double);
  72.         exec_func = dlopen(argv[1], RTLD_LAZY);
  73.         if(!exec_func) {
  74.             munmap(NULL, sizeof(shared_data_t));
  75.             exit(1);
  76.         }
  77.         ret_func = dlsym(exec_func, semaphoric_coop->func_name);
  78.         semaphoric_coop->result = (*ret_func)(semaphoric_coop->value);
  79.         sem_post(&semaphoric_coop->response_ready);
  80.     }
  81.     sem_close(&semaphoric_coop->response_ready);
  82.     sem_close(&semaphoric_coop->request_ready);
  83.     munmap(NULL, sizeof(shared_data_t));
  84.     shm_unlink(shared_memory);
  85.     return 0;
  86. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement