|
|
|
Организация работы с разделяемой памятью!!!!
|
|||
|---|---|---|---|
|
#18+
Всем Привет!! У меня такое задание- Нужно создать 2 программы, первая программа должна создавать сегмент разделяемой памяти и копировать туда собственный исходный текст, вторая программа должна брать оттуда этот текст, печатать его на экране и удалять сегмент разделяемой памяти из системы. Проблема собственно в том, что у меня никак не получается считать с помощью 2-й программы массив символов(ну то что я переслал с помощью 1-й программы) при этом, работая с числами(ну т.е. когда пересылаю массив чисел ) все работает нормально... Вот исходник 1-й программы, вторая судя по всему примерно такая же... Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.03.2011, 17:31 |
|
||
|
Организация работы с разделяемой памятью!!!!
|
|||
|---|---|---|---|
|
#18+
Crass_MarkВсем Привет!! У меня такое задание- Нужно создать 2 программы, первая программа должна создавать сегмент разделяемой памяти и копировать туда собственный исходный текст, вторая программа должна брать оттуда этот текст, печатать его на экране и удалять сегмент разделяемой памяти из системы. Проблема собственно в том, что у меня никак не получается считать с помощью 2-й программы массив символов(ну то что я переслал с помощью 1-й программы) при этом, работая с числами(ну т.е. когда пересылаю массив чисел ) все работает нормально... Вот исходник 1-й программы, вторая судя по всему примерно такая же... Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. уже разобрался ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.03.2011, 16:23 |
|
||
|
Организация работы с разделяемой памятью!!!!
|
|||
|---|---|---|---|
|
#18+
Помогите пожалуйста! Нужно 3 программы, первая записывает в разделяему память, вторая реверсирует эту строку а третья пооказывает строку. написала но передачи строки не осуществляется( 1 программа: #include <sys/types.h> #include <sys/ipc.h> #include <sys/shm.h> #include <stdio.h> #include <errno.h> #include <fcntl.h> #include <unistd.h> #include <sys/stat.h> #include <string.h> int main() { //int f; //char s[100]; char *array; int shmid; int new = 1; char pathname[] = "l54.c"; key_t key; /* Генерируем IPC ключ из имени файла l54.c в * текущей директории и номера * экземпляра области разделяемой памяти 0 */ if((key = ftok(pathname,0)) < 0) { printf("Can't generate key\n"); exit(-1); } /* Пытаемся эксклюзивно создать разделяемую память для сгенерированного ключа, т * .е. если для этого ключа она уже существует, * системный вызов вернет отрицательное значение. * Размер памяти определяем как размер массива из трех целых переменных, п * рава доступа 0666 – чтение и запись разрешены для всех */ if ((shmid = shmget(key, sizeof(char[1000]), 0666|IPC_CREAT|IPC_EXCL)) < 0) { /* В случае ошибки пытаемся определить: * возникла ли она из-за того, * что сегмент разделяемой памяти уже существует * или по другой причине */ if(errno != EEXIST) { /* Если по другой причине – прекращаем работу */ printf("Can't create shared memory\n"); exit(-1); } else { /* Если из-за того, что разделяемая память уже существует, то пытаемся получить ее IPC дескриптор и, в случае удачи, сбрасываем флаг необходимости инициализации элементов массива */ if((shmid = shmget(key, sizeof(char[1000]), 0)) < 0) { printf("Can't find shared memory\n"); exit(-1); } new = 0; } } array=shmat(shmid, NULL, 0); /* if((int *)shmat(shmid, NULL, 0) == (int *)(-1)) { printf("Can't attach shared memory\n"); exit(-1); }*/ char mas[]="abcd"; int i= strlen(mas); for (i=0; mas[i]!='\0'; i++) { printf(mas); } printf("\n Запись прошла успешно!\n"); if (shmdt(mas) < 0) { printf("Can't detach shared memory\n"); exit(-1); } return 0; } 2 программаа: #include <sys/types.h> #include <sys/ipc.h> #include <sys/shm.h> #include <stdio.h> #include <errno.h> #include <fcntl.h> #include <unistd.h> #include <sys/stat.h> #include <string.h> void reverse(char s[]) { int i, j; char c; for (i=0,j=strlen(s)-1;i<j;i++,j--) { c=s[i]; s[i]=s[j]; s[j]=c; } } int main() { //int f; //char s[10000]; char *array; int shmid; int new = 1; char pathname[] = "l54.c"; key_t key; /* Генерируем IPC ключ из имени файла l54.c в * текущей директории и номера * экземпляра области разделяемой памяти 0 */ if((key = ftok(pathname,0)) < 0) { printf("Can't generate key\n"); exit(-1); } /* Пытаемся эксклюзивно создать разделяемую память для сгенерированного ключа, т * .е. если для этого ключа она уже существует, * системный вызов вернет отрицательное значение. * Размер памяти определяем как размер массива из трех целых переменных, п * рава доступа 0666 – чтение и запись разрешены для всех */ if ((shmid = shmget(key, sizeof(char[10000]), 0666|IPC_CREAT|IPC_EXCL)) < 0) { /* В случае ошибки пытаемся определить: * возникла ли она из-за того, * что сегмент разделяемой памяти уже существует * или по другой причине */ if(errno != EEXIST) { /* Если по другой причине – прекращаем работу */ printf("Can't create shared memory\n"); exit(-1); } else { /* Если из-за того, что разделяемая память уже существует, то пытаемся получить ее IPC дескриптор и, в случае удачи, сбрасываем флаг необходимости инициализации элементов массива */ if((shmid = shmget(key, sizeof(char[10000]), 0)) < 0) { printf("Can't find shared memory\n"); exit(-1); } new = 0; } } array=shmat(shmid, NULL, 0); /* if((int *)shmat(shmid, NULL, 0) == (int *)(-1)) { printf("Can't attach shared memory\n"); exit(-1); }*/ /*char mas[]="abcd"; char mas2[]="oooo"; int i= strlen(mas); int yy=0; int uu=0; //for (i=0; mas[i]!='\0'; i++) //{ //mas2 = reverse(mas); //printf(mas); //mas2=mas; strcpy(mas2,mas); //}*/ char mas[]="qwerty"; /*int i= strlen(mas); for (i=0; mas[i]!='\0'; i++) { printf(mas); }*/ reverse(mas); int i= strlen(mas); for (i=0; mas[i]!='\0'; i++) { printf(mas); } printf("\n Запись прошла успешно!\n"); /*if (shmdt(mas) < 0) { printf("Can't detach shared memory\n"); exit(-1); }*/ return 0; } 3 программа: #include <sys/types.h> #include <sys/ipc.h> #include <sys/shm.h> #include <stdio.h> #include <errno.h> #include <fcntl.h> #include <unistd.h> #include <sys/stat.h> #include <string.h> int main() { char *array; int shmid; int new = 1; char pathname[] = "l54.c"; key_t key; /* Генерируем IPC ключ из имени файла l54.c в * текущей директории и номера * экземпляра области разделяемой памяти 0 */ if((key = ftok(pathname,0)) < 0) { printf("Can't generate key\n"); exit(-1); } /* Пытаемся эксклюзивно создать разделяемую память для сгенерированного ключа, т * .е. если для этого ключа она уже существует, * системный вызов вернет отрицательное значение. * Размер памяти определяем как размер массива из трех целых переменных, п * рава доступа 0666 – чтение и запись разрешены для всех */ if ((shmid = shmget(key, sizeof(char[10000]), 0666|IPC_CREAT|IPC_EXCL)) < 0) { /* В случае ошибки пытаемся определить: * возникла ли она из-за того, * что сегмент разделяемой памяти уже существует * или по другой причине */ if(errno != EEXIST) { /* Если по другой причине – прекращаем работу */ printf("Can't create shared memory\n"); exit(-1); } else { /* Если из-за того, что разделяемая память уже существует, то пытаемся получить ее IPC дескриптор и, в случае удачи, сбрасываем флаг необходимости инициализации элементов массива */ if((shmid = shmget(key, sizeof(char[10000]), 0)) < 0) { printf("Can't find shared memory\n"); exit(-1); } new = 0; } } array=shmat(shmid, NULL, 0); /* if((int *)shmat(shmid, NULL, 0) == (int *)(-1)) { printf("Can't attach shared memory\n"); exit(-1); }*/ /* f=open(pathname,O_RDONLY,0666); read(f,s,10000); close(f);*/ char mas[]="abcd"; int i= strlen(mas); for (i=0; mas[i]!='\0'; i++) { printf(mas); } if (shmdt(mas) < 0) { printf("Can't detach shared memory\n"); exit(-1); } return 0; } ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.04.2011, 22:36 |
|
||
|
|

start [/forum/search_topic.php?author=vikor1999&author_mode=last_posts&do_search=1]: |
0ms |
get settings: |
7ms |
get forum list: |
15ms |
get settings: |
9ms |
get forum list: |
18ms |
get settings: |
7ms |
get forum list: |
11ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
293ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
68ms |
get tp. blocked users: |
1ms |
| others: | 1363ms |
| total: | 1806ms |

| 0 / 0 |
