繁体   English   中英

共享内存/ mmap

[英]shared memory/mmap

我对 C 和 Unix 很陌生,所以这可能是一个愚蠢的问题。 昨天我一直在尝试制作 2 个通过共享内存相互通信的程序。 一个是接收者,另一个是发送者。

下面的接收器设置共享内存和 2 个信号量(一个用于读取另一个用于写入)并等待在循环中接收某些东西,如果接收到的字符串为空,则该循环将终止。 两个程序都使用 3 个标志:-m (shared_memory_name) -w (writing_semaphore_name) -r (reading_semaphore_name)

int main(int argc, char** argv)
{

 //sem_in,sem_out,shared_mem_fd,getopt stuff

 //getopt()...

while(1)
{   
    //waiting for sender to change the sem

    if(sem_wait(sem_out)==-1){ //waits for the sender to change the semaphore
            //error
    }
    char* data =  mmap(NULL,4096,PROT_READ|PROT_WRITE,MAP_SHARED,SHM_FD,0);

    if(data == MAP_FAILED){
        //error
    }

    if(strlen(data) == 0){
        //terminate program
    }       


    if(sem_post(sem_in)==-1){
        //error
    }

}

//close sems and shared memory

return 0
}

下面的发送者假设打开共享内存 FD 并放入一些东西,这些东西是我从 argv[optind] 得到的附加参数,通常是一个字符串。

int main(int argc, char** argv){

//sems,getopt variables,filedescriptor

char* data;

//getopt()

data = argv[optind];

if(sem_in == SEM_FAILED || sem_out == SEM_FAILED || SHM_FD == -1){
        //error
}

//printf("waiting\n");

if(sem_wait(sem_in)==-1){
        //error
}

data = mmap(NULL,strlen(data),PROT_READ|PROT_WRITE,MAP_SHARED,SHM_FD,0);    

if(data==MAP_FAILED){
    //error
}

if(sem_post(sem_out)==-1){
        //error
}

close(shared memory);

return 0;
}

这是我如何使用该程序:

./receiver -m /mem1 -w /s1 -r /s2 (creates the memory and sems and waits)
waiting

./sender -m /mem1 -w /s1 -r /s2 hello (send a string)

./receiver -m /mem1 -w /s1 -r /s2
waiting
empty

尽管我发送了一些东西,但接收者说字符串是空的。 信号量被改变了,就是这样。

就像我说的,在这方面我几乎是一个菜鸟,所以我很容易犯愚蠢的错误,我希望我能很好地解释我的问题,任何帮助将不胜感激。

PS 变量名是我的语言,所以如果我忘记翻译一些,请原谅我,而且我做了很多实验,所以以前版本中的一些包含仍然存在......

问题是你没有在共享内存中存储任何东西。 您在代码中有以下两行...

data = argv[optind];

data = (char*)mmap(NULL,strlen(data),PROT_READ|PROT_WRITE,MAP_SHARED,SHM_FD,(off_t)0);

第二个覆盖data的内容,然后您不会将任何内容复制到它指向的内存中。

由于它并没有真正做任何有用的事情,因此您应该删除第一行。 要填充共享内存请在打开添加此行。

memcpy(data,argv[optind],strlen(argv[optind])+1);

而且由于您不再将data指向参数,因此您也需要更改共享内存的打开方式。

data = (char*)mmap(NULL,strlen(argv[optind])+1,PROT_READ|PROT_WRITE,MAP_SHARED,SHM_FD,(off_t)0);

您会注意到我在字符串的长度上加了 1 - 这是为了确保有足够的空间来包含 NUL 终止字符。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM