shmget returns 相同密钥的不同 id
shmget returns different id for same key
您好,我在 Linux 中制作了小型 'client-server' 文件传输程序。但是奇怪的事情正在发生。如果我启动第一个客户端然后服务器一切正常。 shmget() 为提供的密钥提供相同的 ID。不幸的是,如果我先启动服务器,然后启动客户端,我在客户端中会得到不同的 ID,并且我无法复制数据。
我正在使用 IPC_CREAT 标志,因此它应该加入共享内存。
客户端
id=shmget(138134,1,0777|IPC_CREAT);
服务器
id=shmget(138134,1,0777|IPC_CREAT);
客户端
服务器
基本信息
所以基本上有 3 个元素的信号量。服务器 | sem0 |共享内存 | sem1 |客户。当服务器和客户端发现 EOF 时使用 Sem2。我一个字符一个字符地复制数据。客户端和服务器都具有相同的功能。创建,删除等有基本的信号量和共享内存功能。唯一的区别在于main。不幸的是代码是波兰语,但也许它会有所帮助。
主服务器
utworz_nowy_semafor();//semaphore creating
upd(); //shared memory creating
upa(); //shared memory attaching
odlaczenie1=shmctl(pamiec,IPC_RMID,0); //marking shared memory to delete(waiting for detach)
FILE* we = fopen("zrodlo", "r");
if(we == NULL)
{
printf("Blad otwierania pliku wejsciowego");
exit(1);
}
else
{
printf("Otworzony plik wejsciowy\n");
}
int c;
semafor_v(0); // opening the gate
while((c = fgetc(we)) != EOF)
{
semafor_p(0); // closing the gate
wstaw(c);
semafor_v(1);
}
semafor_p(0);
wstaw(c);
semafor_v(1);
fclose(we);
printf("Zamknalem pilk zrodlowy! Czekam na sygnal od konsumenta aby zakonczyc dzialanie$
semafor_p(2);
printf("Konsument skonczył kopiowanie. Zamykam program!\n");
odlaczenie2=shmdt(adres);
if (odlaczenie1==-1 || odlaczenie2==-1)
{
printf("Problemy z odlaczeniem pamieci dzielonej.\n");
exit(EXIT_FAILURE);
}
else printf("Pamiec dzielona zostala odlaczona.\n");
//odlacz_pamiec();
exit(EXIT_SUCCESS);
客户端主
utworz_nowy_semafor();
upd();
upa();
FILE* wy; wy = fopen("wynik", "w");
if(wy == NULL)
{
printf("Blad tworzenia pliku");
exit(1);
}
else
{
printf("Plik wynikowy utworzony!\n");
}
while(1 != 0)
{
semafor_p(1);
char c = wez();
if(c == EOF)
{
printf("Nastąpił koniec pliku. Wykonuję przerwanie petli\n");
fclose(wy);
break;
}
fputc(c, wy);
printf("Konsument odebral znak: %c\n",c);
semafor_v(0);
}
semafor_v(2);
usun_semafor();
odlaczenie1=shmctl(pamiec,IPC_RMID,0);
odlaczenie2=shmdt(adres);
if (odlaczenie1==-1 || odlaczenie2==-1)
{
printf("Problemy z odlaczeniem pamieci dzielonej.\n");
exit(EXIT_FAILURE);
}
else printf("Pamiec dzielona zostala odlaczona.\n");
exit(EXIT_SUCCESS);
已修复:我无法将信号量标记为分离,直到客户端加入它
您好,我在 Linux 中制作了小型 'client-server' 文件传输程序。但是奇怪的事情正在发生。如果我启动第一个客户端然后服务器一切正常。 shmget() 为提供的密钥提供相同的 ID。不幸的是,如果我先启动服务器,然后启动客户端,我在客户端中会得到不同的 ID,并且我无法复制数据。 我正在使用 IPC_CREAT 标志,因此它应该加入共享内存。
客户端
id=shmget(138134,1,0777|IPC_CREAT);
服务器
id=shmget(138134,1,0777|IPC_CREAT);
客户端
服务器
基本信息 所以基本上有 3 个元素的信号量。服务器 | sem0 |共享内存 | sem1 |客户。当服务器和客户端发现 EOF 时使用 Sem2。我一个字符一个字符地复制数据。客户端和服务器都具有相同的功能。创建,删除等有基本的信号量和共享内存功能。唯一的区别在于main。不幸的是代码是波兰语,但也许它会有所帮助。
主服务器
utworz_nowy_semafor();//semaphore creating
upd(); //shared memory creating
upa(); //shared memory attaching
odlaczenie1=shmctl(pamiec,IPC_RMID,0); //marking shared memory to delete(waiting for detach)
FILE* we = fopen("zrodlo", "r");
if(we == NULL)
{
printf("Blad otwierania pliku wejsciowego");
exit(1);
}
else
{
printf("Otworzony plik wejsciowy\n");
}
int c;
semafor_v(0); // opening the gate
while((c = fgetc(we)) != EOF)
{
semafor_p(0); // closing the gate
wstaw(c);
semafor_v(1);
}
semafor_p(0);
wstaw(c);
semafor_v(1);
fclose(we);
printf("Zamknalem pilk zrodlowy! Czekam na sygnal od konsumenta aby zakonczyc dzialanie$
semafor_p(2);
printf("Konsument skonczył kopiowanie. Zamykam program!\n");
odlaczenie2=shmdt(adres);
if (odlaczenie1==-1 || odlaczenie2==-1)
{
printf("Problemy z odlaczeniem pamieci dzielonej.\n");
exit(EXIT_FAILURE);
}
else printf("Pamiec dzielona zostala odlaczona.\n");
//odlacz_pamiec();
exit(EXIT_SUCCESS);
客户端主
utworz_nowy_semafor();
upd();
upa();
FILE* wy; wy = fopen("wynik", "w");
if(wy == NULL)
{
printf("Blad tworzenia pliku");
exit(1);
}
else
{
printf("Plik wynikowy utworzony!\n");
}
while(1 != 0)
{
semafor_p(1);
char c = wez();
if(c == EOF)
{
printf("Nastąpił koniec pliku. Wykonuję przerwanie petli\n");
fclose(wy);
break;
}
fputc(c, wy);
printf("Konsument odebral znak: %c\n",c);
semafor_v(0);
}
semafor_v(2);
usun_semafor();
odlaczenie1=shmctl(pamiec,IPC_RMID,0);
odlaczenie2=shmdt(adres);
if (odlaczenie1==-1 || odlaczenie2==-1)
{
printf("Problemy z odlaczeniem pamieci dzielonej.\n");
exit(EXIT_FAILURE);
}
else printf("Pamiec dzielona zostala odlaczona.\n");
exit(EXIT_SUCCESS);
已修复:我无法将信号量标记为分离,直到客户端加入它