Почему я получаю ошибку шины (ядро сброшено), используя общую память - PullRequest
0 голосов
/ 15 марта 2020

Я новичок в C, так что не пугайтесь, если вы видите некоторые ошибки в коде.

Я пытаюсь отправить слова, используя общую память, я хочу ввести число, затем слово и скопируйте слово столько раз, сколько я указываю в числе, но если число равно 0, программа завершается.

Я получаю ошибку шины (код сброшен), если я перезапускаю GNS5, она не показывает ошибку с первой попытки, а потом да. Во втором файле всегда отображается ошибка.

Вот мой код:

Чтение файла

#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <semaphore.h>
#include <unistd.h>
#include <sys/types.h>
#include <string.h>

#include <sys/ioctl.h>
#include <termio.h>

#include <sys/shm.h>

#define SHM_KEY 0x1234

void err_sys(const char* text){
    perror(text);
    exit(1);
}
struct shmseg
{
    int number;
    char filename[50];
    char word[100];
};
int main(int argc,char *argv[])
{
    int shmid;
    int sem_value;
    struct shmseg *shmp;
    char local_word[100];
    sem_t*  psem1;
    sem_t*  psem2;
    int num;
    int result;

    if(argc!=2)
    {
        printf("Enter the filename.\n");
        exit(1);
    }

    psem1 = (sem_t*)sem_open("/sem_1", O_CREAT, 0600, 1);
    if (psem1 == SEM_FAILED)
    {
        err_sys("Open psem1");
    }
    /* Create psem2 */
    psem2 = (sem_t*)sem_open("/sem_2", O_CREAT, 0600, 0);
    if (psem2 == SEM_FAILED)
    {
        err_sys("Open psem2");
    }
    result = sem_getvalue(psem2, &sem_value);
    if (result < 0)
    {
        err_sys("Read psem2");
    }
    /* Wait for sem_value to be 0 */
    while (sem_value > 0)
    {
        sem_wait(psem2);
        sem_value--;
    }
    while (sem_value < 0)
    {
        sem_wait(psem2);
        sem_value++;
    }
    result = sem_getvalue(psem1, &sem_value);
    if (result < 0)
    {
        err_sys("Read psem1");
    }
    while (sem_value > 1)
    {
        sem_wait(psem1);
        sem_value--;
    }
    while (sem_value < 1)
    {
        sem_wait(psem1);
        sem_value++;
    }


    shmid = shmget(SHM_KEY, sizeof(struct shmseg), 0666|IPC_CREAT);
    if (shmid == -1)
        err_sys("Shared Memory Error");

    //attach to the shmp pointer
    shmp = shmat(shmid, NULL, 0);
    if (shmp == (void*)(-1))
        err_sys("Shared Memory attachment error");
    strcpy((char*)(shmp->filename),argv[1]);
    while(1)
    {
        sem_wait(psem1);

        printf("Enter a number[0 to exit]: ");
        scanf("%d",&num);
        if(num==0)
        {
            break;
        }
        shmp->number=num;

        printf("Enter a word: ");
        scanf("%s",local_word);
        strcpy((char*)(shmp->word),local_word);

        sem_post(psem2);
    }

    exit(0);

}

Чтение и печать файла:


#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdio.h>
#include <semaphore.h>
#include <stdlib.h>

#define SHM_KEY 0x1234
void err_sys(const char* text){
    perror(text);
    exit(1);
}
struct shmseg
{
    int number;
    int process;
    char filename[255];
    char word[255];
};
int main()
{
    int sem_value;
    FILE *fp;
    sem_t*  psem1;
    sem_t*  psem2;
    int shmid;
    struct shmseg *shmp;
    int result;

    psem1 = (sem_t*)sem_open("/sem_1", IPC_CREAT, 0600, 0);
    if (psem1 == SEM_FAILED)
    {
        err_sys("Open psem1");
    }

    psem2 = (sem_t*)sem_open("/sem_2", IPC_CREAT, 0600, 1);
    if (psem2 == SEM_FAILED)
    {
        err_sys("Open psem2");
    }

    result = sem_getvalue(psem1, &sem_value);
    if (result < 0)
    {
        err_sys("Read psem1");
    }


    while (sem_value > 0)
    {
        sem_wait(psem1);
        sem_value--;
    }
    while (sem_value < 0)
    {
        sem_wait(psem2);
        sem_value++;
    }
    result = sem_getvalue(psem2, &sem_value);
    if (result < 0)
    {
        err_sys("Read psem2");
    }
    while (sem_value > 1)
    {
        sem_wait(psem2);
        sem_value--;
    }

    while (sem_value < 1)
    {
        sem_wait(psem1);
        sem_value++;
    }

    shmid = shmget(SHM_KEY, sizeof(struct shmseg), 0666);
    if (shmid == -1)
        err_sys("Shared Memory Error");

    //attach to the shmp pointer
    shmp = shmat(shmid, NULL, 0);
    if (shmp == (void*)(-1))
        err_sys("Shared Memory attachment error");

    fp = fopen((char*)shmp->filename,"w");

    while(1)
    {
        sem_wait(psem2);

        for(int i=0; i<shmp->number; i++)
        {
            printf("Data read from memory: %s\n",shmp->word);
            fputs(shmp->word,fp);
        }
        sem_post(psem1);
    }

    fclose(fp);

    // destroy the shared memory
    shmctl(shmid,IPC_RMID,NULL);

    exit(0);
}

Заранее спасибо.

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