首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >共享内存/mmap

共享内存/mmap
EN

Stack Overflow用户
提问于 2017-05-04 09:18:07
回答 1查看 371关注 0票数 1

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

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

代码语言:javascript
复制
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并输入一些内容,这是我从argvoptind获得的附加参数,通常是一个字符串。

代码语言:javascript
复制
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;
}

我就是这样使用这个程序的:

代码语言:javascript
复制
./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

尽管我发送了什么,接收者说字符串是空的。信号灯变了,所以。

就像我说的,在这件事上我是个新手,所以我很容易犯愚蠢的错误,我希望我能很好地解释我的问题,任何帮助都会很感激。

变名在我的语言中,所以如果我忘了翻译一些,那么请原谅我,而且我做了大量的实验,所以一些以前版本中的名字仍然存在。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-05-04 09:31:29

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

代码语言:javascript
复制
data = argv[optind];

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

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

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

代码语言:javascript
复制
memcpy(data,argv[optind],strlen(argv[optind])+1);

而且,由于您不再将data指向该参数,您还需要更改共享内存的打开位置。

代码语言:javascript
复制
data = (char*)mmap(NULL,strlen(argv[optind])+1,PROT_READ|PROT_WRITE,MAP_SHARED,SHM_FD,(off_t)0);

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43778759

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档