嗨,这段代码可以很好地存储在共享内存整数中,但是我想存储字符串,我该如何修改它来做到这一点?
例如,输出将为Written:这是行号1,在下一行Written:这是行号2
#include <string.h>
#include <stdio.h>
#include <memory.h>
#include <sys/shm.h>
#include <unistd.h>
void main()
{
key_t Clave;
int Id_Memoria;
int *Memoria = NULL;
int i,j;
Clave = ftok ("/bin/ls", 33);
if (Clave == -1)
{
printf("No consigo clave para memoria compartida");
exit(0);
}
Id_Memoria = shmget (Clave, 1024, 0777 | IPC_CREAT);
if (Id_Memoria == -1)
{
printf("No consigo Id para memoria compartida");
exit (0);
}
Memoria = (int *)shmat (Id_Memoria, (char *)0, 0);
if (Memoria == NULL)
{
printf("No consigo memoria compartida");
exit (0);
}
for (j=0; j<100; j++)
{
Memoria[j] = j;
printf( "Written: %d \n" ,Memoria[j]);
}
shmdt ((char *)Memoria);
shmctl (Id_Memoria, IPC_RMID, (struct shmid_ds *)NULL);
}
最佳答案
您需要逐个字符地将字符串复制到共享内存。指向共享内存中变量的实际指针需要保留在外部,因为共享内存可以在不同的进程中位于不同的地址中。 (您可以使用增量指针,但在C ++ boost::offset_ptr中它们要容易得多)
为了处理字符串,string.h中有字符串实用程序函数。当将字符串移动到不同的存储位置时,strncpy特别有用。
同样,最好使用新的posix共享内存代替当前的sysv实现。您可以在shm_overview手册页中查看有关posix共享内存的更多详细信息。当然,如果您的旧操作系统仅支持sysv接口,那么您必须坚持使用旧api。
关于c - 将字符串存储在共享内存C中,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40200227/