Z
Z
zaharLang2014-06-05 03:24:10
linux
zaharLang, 2014-06-05 03:24:10

Why does it give an error when executed: Segmentation error (memory dumped) ? linux

Hello!
help with the task.
Four child processes perform some cycles of work, passing after the end of the next cycle through the same segment of shared memory to the parent process the next line of some poem, while the first process sends the 1st, 5th, 9th, etc. lines, the second - the 2nd, 6th, 10th, etc. lines, the third - the 3rd, 7th, 11th, etc. lines, the fourth - the 4th, 8th, 12th, etc. lines. Process cycles are not balanced in time. The parent process assembles the completed poem from the passed fragments and outputs it when all processes terminate. Solve the problem using the semaphore apparatus.
when executed it throws an error : Segmentation error (memory dumped)
gdb gives : 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]);
        }
 
 
                    }
            }
        }
    }
          
               
        
  
        
    }

Answer the question

In order to leave comments, you need to log in

2 answer(s)
J
jcmvbkbc, 2014-06-05
@zaharLang

the array of pointers array is not in shared memory, the parent process does not see the changes that the children make to it.

Z
zaharLang, 2014-06-05
@zaharLang

so how do you know that an array is in shared memory, and is it possible to do without pointers?

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question