@zaharLang

Почему при выполнении он выдает ошибку : Ошибка сегментирования (сделан дамп памяти) ? linux

Здравствуйте!
помогите с задачей.
Четыре дочерних процесса выполняют некоторые циклы работ, передавая после окончания очередного цикла через один и тот же сегмент разделяемой памяти родительскому процессу очередную строку некоторого стихотворения, при этом первый процесс передает 1-ю, 5-ю, 9-ю и т.д. строки, второй - 2-ю, 6-ю, 10-ю и т.д строки, третий - 3-ю, 7-ю, 11-ю и т.д. строки, четвертый - 4-ю, 8-ю, 12-ю и т.д. строки. Циклы работ процессов не сбалансированы по времени. Родительский процесс компонует из передаваемых фрагментов законченное стихотворение и выводит его по завершении работы всех процессов. Решить задачу с использованием аппарата семафоров.

при выполнении он выдает ошибку : Ошибка сегментирования (сделан дамп памяти)

gdb выдает : Program received signal SIGSEGV, Segmentation fault.
0x00007ffff7a5e040 in vfprintf () from /lib/x86_64-linux-gnu/libc.so.6

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <unistd.h>
#include  <stdlib.h>
#include <sys/sem.h>
#include <wait.h>
int main()
 
{
    int semid,status1,status2,status3,status4;
    int semid2,semid3, semid4,i;
    int pid1,pid2,pid3,pid4;
    char pathname[] = "ass.c"; 
    struct sembuf mybuf;
    struct sembuf mybuf2;
    struct sembuf mybuf3;
    struct sembuf mybuf4;
    key_t key;
    char *array[12];
    
    int shmid;
    /* IPC дескриптор для области разделяемой памяти */
    int new = 1;
    /* Флаг необходимости инициализации элементов массива */
    /* IPC ключ */
    /* Генерируем IPC ключ из имени файла 06-1a.c в
    текущей директории и номера экземпляра области
    разделяемой памяти 0 */
    if((key = ftok(pathname,0)) < 0){
        printf("Can\'t generate key\n");
        _exit(-1);
    }
    /* Пытаемся эксклюзивно создать разделяемую память для
    сгенерированного ключа, т.е. если для этого ключа она
    уже существует, системный вызов вернет отрицательное
    значение. Размер памяти определяем как размер массива
    из трех целых переменных, права доступа 0666 – чтение
    и запись разрешены для всех */
    if((shmid = shmget(key, sizeof(char[12]),
    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[12]), 0)) < 0){
    printf("Can\'t find shared memory\n");
    exit(-1);
    }
    }
    }
    /* Пытаемся отобразить разделяемую память в адресное
    пространство текущего процесса. Обратите внимание на то,
    что для правильного сравнения мы явно преобразовываем
    значение -1 к указателю на целое.*/
    if(((int *)shmat(shmid, NULL, 0)) == (void *)(-1)){
    printf("Can't attach shared memory\n");
    exit(-1);
    }
 
    pid_t child_1,child_2,child_3,child_4;
    printf("I am a main.  My pid is:%d  my ppid is %d\n"
                        , getpid(), getppid() );
    child_1 = fork();
    waitpid(child_1,&status1, 0);
    if (child_1 == 0) {
        /* Child 1 code */
               mybuf.sem_op =1;
            mybuf.sem_flg = 0;
            mybuf.sem_num = 0;
            semop(semid, &mybuf, 1);
 
          char text1[3][50]= {
                "1 ctroka stixa", 
                "5 ctroka stixa", 
                "9 ctroka stixa", 
            };
        //    printf("ctroka:-- %s \n",text1[0]);
            array[0]= text1[0];
            array[4]= text1[1];
            array[8]= text1[2];
 
            mybuf2.sem_op =-1;
            mybuf2.sem_flg = 0;
            mybuf2.sem_num = 0;
            semop(semid2, &mybuf2, -1);
 
            mybuf3.sem_op =-1;
            mybuf3.sem_flg = 0;
            mybuf3.sem_num = 0;
            semop(semid3, &mybuf3, -1);
 
            mybuf4.sem_op =-1;
            mybuf4.sem_flg = 0;
            mybuf4.sem_num = 0;
            semop(semid4, &mybuf4, -1);
 
        printf("I am a 1.  My pid is:%d  my ppid is %d\n",
                         getpid(), getppid() );
            exit(0);
 
 
 
    } else {
        child_2 = fork();
        waitpid(child_1,&status1, 0);
        if (child_2 == 0) {
            /* Child 2 code */
            
            mybuf.sem_op =-1;
            mybuf.sem_flg = 0;
            mybuf.sem_num = 0;
            semop(semid, &mybuf, -1);
            
            mybuf2.sem_op =1;
            mybuf2.sem_flg = 0;
            mybuf2.sem_num = 0;
            semop(semid2, &mybuf2, 1);
 
             char text2[3][50] = {
                    "2 ctroka stixa", 
                    "6 ctroka stixa", 
                    "10 ctroka stixa", 
                    };
           // printf("ctroka:-- %s \n",text2[0]);        
            array[1]= text2[0];
            array[5]= text2[1];
            array[9]= text2[2];
 
                mybuf3.sem_op =-1;
                mybuf3.sem_flg = 0;
                mybuf3.sem_num = 0;
                semop(semid3, &mybuf3, -1);
 
                mybuf4.sem_op =-1;
                mybuf4.sem_flg = 0;
                mybuf4.sem_num = 0;
                semop(semid4, &mybuf4, -1);
 
            printf("I am a 2.  My pid is:%d  my ppid is %d\n",
                         getpid(), getppid() );
            
            exit(0);
 
 
        } else {
            child_3 = fork();
            waitpid(child_2,&status2, 0);
            if (child_3 == 0) {
                /* Child 3 code */
               
                mybuf2.sem_op =-1;
                mybuf2.sem_flg = 0;
                mybuf2.sem_num = 0;
                semop(semid2, &mybuf2, -1);
                    
                mybuf3.sem_op =1;
                mybuf3.sem_flg = 0;
                mybuf3.sem_num = 0;
                semop(semid3, &mybuf3, 1);
 
 
                char text3[3][50] = {
                    "3 ctroka stixa", 
                    "7 ctroka stixa", 
                    "11 ctroka stixa", 
                    };
             //   printf("ctroka:-- %s \n",text3[0]);
                array[2]= text3[0];
                array[6]= text3[1];
                array[10]= text3[2];
 
                mybuf4.sem_op =-1;
                mybuf4.sem_flg = 0;
                mybuf4.sem_num = 0;
                semop(semid4, &mybuf4, -1);
 
                 mybuf.sem_op =-1;
                mybuf.sem_flg = 0;
                mybuf.sem_num = 0;
                semop(semid, &mybuf, -1);
                    
                printf("I am a 3.  My pid is:%d  my ppid is %d\n",
                             getpid(), getppid() );
                exit(0);
 
 
            } else {
                child_4 = fork();
                waitpid(child_3,&status3, 0);
                if (child_4 == 0) {
                    /* Child 4 code */
                    
                    mybuf3.sem_op =-1;
                    mybuf3.sem_flg = 0;
                    mybuf3.sem_num = 0;
                    semop(semid3, &mybuf3, -1);
                    
                    mybuf4.sem_op =1;
                    mybuf4.sem_flg = 0;
                    mybuf4.sem_num = 0;
                    semop(semid4, &mybuf4, 1);
 
                    char text4[3][50] = {
                    "4 ctroka stixa", 
                    "8 ctroka stixa", 
                    "12 ctroka stixa", 
                    };
                //    printf("ctroka:-- %s \n",text4[0]);
                    array[3]= text4[0];
                    array[7]= text4[1];
                    array[11]= text4[2];
 
                    mybuf.sem_op =-1;
                    mybuf.sem_flg = 0;
                    mybuf.sem_num = 0;
                    semop(semid, &mybuf, -1);
                    
 
                    mybuf2.sem_op =-1;
                    mybuf2.sem_flg = 0;
                    mybuf2.sem_num = 0;
                    semop(semid2, &mybuf2, -1);
                    
                    
                    
                    printf("I am a 4.  My pid is:%d  my ppid is %d\n",
                                 getpid(), getppid() );
                    
                  exit(0);
                    
 
                } else {
                    /* Parent Code */
                
          sleep(5);
             waitpid(child_4,&status4, 0);
                    for(i=0;i<12;i++){
            printf("ctroka:-- %s \n",array[i]);
        }
 
 
                    }
            }
        }
    }
          
               
        
  
        
    }
  • Вопрос задан
  • 6912 просмотров
Решения вопроса 1
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
массив указателей array не находится в разделяемой памяти, процесс-родитель не видит изменений, которые дети делают в нём.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@zaharLang Автор вопроса
так как узнать что array находится в разделяемой памяти, и можно ли обойтись без указателей ?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы