Я новичок в 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);
}
Заранее спасибо.