我想让 2 个程序进行通信,一个(服务器)将存储数据,另一个(客户端)将访问它。我将不得不使用链表来存储数据,因为它不会停止存储,然后我想知道如果只有第一个节点在内存中共享,我是否可以访问整个链表。
我的意思是……我们可以从客户端程序访问共享指针指向的内存吗?
抱歉,显然我们不能,所以我应该将我的链表存储到共享内存中,还是你认为这会很尴尬?因为如果我这样做,我将不得不为每个节点声明一个共享内存,对吗?
所以,要为两个程序添加共享内存,我需要相同的密钥,但我不知道会有多少密钥,而且我不能只为两个程序存储它,除非我已经有一个链表......
所以我使用了一个非常非常非常尴尬的方法,我什至不知道它是否工作正常,但我希望你能知道,这是使用应该采用 (url,pid) 并返回密钥的 ftok。所以我假设如果我使用相同的 url 和 pid,它会发送完全相同的密钥,使用从 0 开始的假 pid,我会为我添加到链表的每个元素递增......你怎么看?任何其他看起来不那么……废话的方法?
typedef struct s_shared_elem
{
    char c;
    struct s_shared_elem* next;
    struct s_shared_elem* previous;
}shared_elem;
typedef struct s_shared_list
{
    s_shared_elem* first;
    s_shared_elem* last;
}shared_list;
int forthekey = 0;
char* url="/home/toor/Projet_cgi/";
shared_elem* shared_malloc(int pid, const char* url)
{
        shared_elem* shm;
        int shmid;
        int key=ftok(url,pid);
        if((shmid=shmget(key,1,IPC_CREAT | 0666)) < 0)
        {   
            perror("shmget");
            exit(1);
        }   
        if ((shm = shmat(shmid,NULL,0)) == (shared_elem*)-1)
        {
             perror("shmat");
             exit(1);
        }
        return shm;
}
void Init_shared_list(shared_list* liste)
{
    liste->first = NULL;
    liste->last = NULL;
}
void Add_elem(shared_list* liste)
{
    shared_elem* new = shared_malloc(pid,url);
    new->next = NULL;
    new->previous = liste->last;
    if(liste->first == NULL)
    {
        liste->first = new;
        liste->last = new;
    }
    else
    {
        liste->last->next = new;
        liste->last = new;
    }
    forthekey++;
}
void shared_free(shared_elem* todelete,int pid, const char* url)
{
    shared_elem* shm;
    int shmid;
    int key=ftok(url,pid);
    if((shmid=shmget(key,1,IPC_CREAT | 0666)) < 0)
    {
        perror("shmget");
        exit(1);
    }
    shmdt(todelete);
    shmctl(shmid,IPC_RMID,NULL);
    forthekey--;
}
void Delete_list(shared_list* liste)
{
    while(liste->last != liste->first)
    {
        shared_elem* tmp=liste->last;
        liste->last=liste->last->previous;
        Shared_free(tmp,pid,url);
    }
    Shared_free(liste->first,pid,url);
}