Форум сайта python.su
0
Помогите пожалуйста, очень нужно, я в этом не разбираюсь, дали задание в универе
Написать программу, которая порождает дочерний процесс, и общается с ним через средства
взаимодействия согласно варианту (Разделяемая память), передавая и получая информацию согласно варианту (Родитель передает потомку две строки S1 и S2, тот возвращает их конкатенацию S2+S1.).
Передачу и получение информации каждым из процессов сопровождать выводом на экран информации
типа “процесс такой-то передал/получил такую-то информацию”.
Дочерние процессы начинают операции после получения сигнала SIGUSR1 от родительского
процесса.
Для меня это написать невозможно(
Есть код на плюсах
#include <sys/types.h> #include <unistd.h> #include <stdbool.h> #include <stdio.h> #include <stdlib.h> #include <sys/wait.h> #include <signal.h> #include <sys/mman.h> #include <string.h> #include <fcntl.h> bool f = false; void my_handler(int nsig) { if (nsig == SIGUSR1) { f=true; } } int main (void) { pid_t pid; char s[100]; char g[100]; char fs[100]; char fg[100]; int fd_shm, *shared,*shared2, i,j; /* Дескриптор объекта в разделяемой памяти*/ signal(SIGUSR1, my_handler); if ((fd_shm = shm_open("myshared.shm", O_RDWR | O_CREAT, 0777)) < 0) { perror ("error create shm"); return (1); } ftruncate(fd_shm, sizeof(s)); // Устанавливаем размер разделяемой памяти shared = mmap(NULL, sizeof(s), PROT_READ | PROT_WRITE, MAP_SHARED, fd_shm, 0); shared2 = mmap(NULL, sizeof(g), PROT_READ | PROT_WRITE, MAP_SHARED, fd_shm, 0); printf("Порождение ребенка \n"); if ((pid = fork()) == -1) printf("Ошибка!"); else if (pid == 0) { printf("1\n"); while (f == false){} printf("2\n"); for (i = 0; i < sizeof(s)/sizeof(char); i++) { fs[i]=*shared; *++shared;} printf("FS %s \n",fs); for (j = 0; j < sizeof(g)/sizeof(char); j++) {fg[j]=*shared; *++shared;} strcat(fs,fg); for (i = 0; i < sizeof(fs)/sizeof(char); i++) *shared2++ =fs[i]; printf("%s \n",fs); if (kill(getppid(), SIGUSR1) == false) { printf("Сигнал родителю\n"); } } else { printf("Введите первое слово: "); scanf("%s",s); printf("Введите второе слово: "); scanf("%s",g); for (i = 0; i < sizeof(s)/sizeof(char); i++) *shared++ =s[i]; // Записываем первое слово в разделяемую память for (j = 0; j < sizeof(g)/sizeof(char); j++) *shared++ =g[j]; // Записываем второе слово в разделяемую память if (kill(pid, SIGUSR1) == false) { printf("Сигнал послан\n"); } while (f==false){} for (i = 0; i < sizeof(fs)/sizeof(char); i++) {*shared = fs[i]; fs[i]=*shared2; *++shared2;} printf("%s \n",fs); wait(NULL); } exit(0); }
Отредактировано edgar1230 (Июнь 19, 2016 20:37:33)
Офлайн
88
edgar1230Просто интересно, как называется Ваша специальность?
очень нужно, я в этом не разбираюсь, дали задание в универе
Офлайн
0
ShamanЯ не на программиста учусь, если это интересовало. Обычный инженер.
Просто интересно, как называется Ваша специальность?
Офлайн
2
Что это за универ, где дают задания, которые студенты не в силах самостоятельно решить?
Или просто прогуливали пары?
Офлайн
88
edgar1230Если дальше так продолжите, будете не обычным, а очень хреновым инженером.
Я не на программиста учусь, если это интересовало. Обычный инженер.
Офлайн