Ошибка сегментации 11, пытающаяся получить данные после использования memcpy - PullRequest
0 голосов
/ 05 февраля 2019

Я столкнулся с проблемой при запуске файла a.out с помощью команды ./a.out.Я получаю код ошибки сегментации № 11. Я получаю ошибку сегментации при попытке доступа к sharedMemory.Я использую memcpy, чтобы вставить данные в общую память.Это ошибка сегментации 11.

Правильно ли я обращаюсь к памяти?

#include<stdio.h>
#include<sys/types.h>
#include<sys/shm.h>
#include<sys/ipc.h>
#include<unistd.h>
#include<time.h>
int main(){
    pid_t childPid;
    childPid = fork();
    char *shm;
    if(childPid == 0){
        char *args[] ={"ls","-l",NULL};
        int shmid;
        int shsize = 100;
        key_t key;
        char *s;
        key = 9876;
        shmid = shmget(key,shsize, IPC_CREAT | 0666);
        if(shmid < 0){
            printf("error getting shmid");
            exit(1);
        }

        shm = shmat(shmid,NULL,0);
        if(shm == (char *) -1){
            printf("error getting shared memory");
            exit(1);
        }
        time_t startTime;
        gettimeofday(&startTime,0);
        memcpy(shm,&startTime,sizeof(startTime));
        time_t endTime;
        execvp(args[0],args);
        printf("successfuly created child proceess");
        exit(0);
    }

    else if (childPid <0){
        printf("unsuccessfuly created child proccess");



        else{
            int returnStatus;
            waitpid(childPid,&returnStatus,0);
            if(returnStatus == 0){
                printf("The child terminated normally");
                printf("%s",*shm);
            }

            if(returnStatus == 1){

                printf("The child terminated with error");
            }
        }

    }
}

1 Ответ

0 голосов
/ 05 февраля 2019

В

    time_t startTime;
    gettimeofday(&startTime,0);

первый аргумент gettimeofday должен быть struct timeval *, а не time_t *

, поэтому

    struct timeval startTime;
    gettimeofday(&startTime,0);

В

char *shm;
...
printf("%s",*shm);

вы не должны разыменовывать shm , поскольку в настоящее время код ascii его первого символа используется в качестве адреса строки, должен быть

char *shm;
...
printf("%s",shm);

После

else if (childPid <0){
    printf("unsuccessfuly created child proccess");

a } отсутствует


Я рекомендую вам скомпилировать запрос компилятора для выдачи предупреждений, с gcc используйте опции -pedantic -Wall

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...