Advertisement
VladIstLove

Untitled

Apr 18th, 2021
557
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.46 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <dlfcn.h>
  4. #include <sys/mman.h>
  5. #include <sys/stat.h>
  6. #include <fcntl.h>
  7. #include <unistd.h>
  8. #include <sys/types.h>
  9. #include <semaphore.h>
  10. #include <string.h>
  11.  
  12. typedef struct {
  13.     sem_t request_ready;  // начальное значение 0
  14.     sem_t response_ready; // начальное значение 0
  15.     char func_name[20];
  16.     double value;
  17.     double result;
  18. } shared_data_t;
  19.  
  20. typedef double (*function)(double);
  21.  
  22.  
  23. int main(int argc, char** argv) {
  24.     void* lib = dlopen(argv[1], RTLD_LAZY);
  25.  
  26.     int shrd = shm_open("/pva_shrd", O_CREAT | O_RDWR, 0777);
  27.     ftruncate(shrd, sizeof(shared_data_t));
  28.     void* mmap_ptr = mmap(NULL, sizeof(shared_data_t), PROT_READ | PROT_WRITE, MAP_SHARED, shrd, 0);
  29.  
  30.     shared_data_t* task_ptr;
  31.     task_ptr = mmap_ptr;
  32.     sem_init(&task_ptr->request_ready, 1, 0);
  33.     sem_init(&task_ptr->response_ready, 1, 0);
  34.  
  35.     printf("/pva_shrd\n");
  36.     fflush(stdout);
  37.  
  38.     char func_name[20];
  39.     int i = 0;
  40.     while (1) {
  41.         sem_wait(&task_ptr->request_ready);
  42.         sscanf(task_ptr->func_name, "%s", func_name);
  43.         if (strlen(task_ptr->func_name) == 0) {
  44.             break;
  45.         }
  46.         function foo = dlsym(lib, task_ptr->func_name);
  47.         task_ptr->result = foo(task_ptr->value);
  48.         sem_post(&task_ptr->response_ready);
  49.     }
  50.  
  51.     munmap(mmap_ptr, sizeof(shared_data_t));
  52.     shm_unlink("/pva_shrd");
  53.  
  54.     dlclose(lib);
  55. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement