从共享内存段中读取和写入信号的地方在哪里?【JAVA教程】

!
也想出现在这里? 联系我们
信息

从共享内存段中读取和写入信号的地方在哪里?,第1张

概述从共享内存段中读取写入信号的地方在哪里?

我已经实现了一个基于共享内存模拟pipe()系统调用的库。

现在,当我没有使用任何fork() ,例如没有调用任何subprocess时,代码工作正常。

我的库需要与任何给定的 int main()程序一起工作,所以这里的基本问题是用信号量进行的修改应该在库中进行,而不是在主程序中进行。

图书馆 :

基于共享内存的聊天应用程序出现问题

系统V共享内存权限位:含义以及如何更改

我们如何检查linux中进程的“locking”共享内存?

防止截断共享映射文件?

拒绝从非分叉进程访问共享内存

这是图书馆:

static int flag = FALSE; static int mutex_init = 0; static pthread_mutex_t lock; #define BUFFER 4096 int my_new_finish() { return 1; // always successful } voID error_out(const char *msg) { perror(msg); exit(EXIT_FAILURE); }

现在,当我不使用调用fork() main时,这个库工作正常。

但是,当我使用fork() ,所有地狱刹车松动。

例如 :

#include <stdio.h> #include <stdlib.h> int main() { int spd,pID,rb; char buff[4096]; my_new_init(); if (my_new_fifo(\”tmp_shm_pipe\”,0666) < 0) { perror(\”my_new_fifo\”); exit(1); } if (fork()) { spd = my_new_open(\”tmp_shm_pipe\”,O_RDONLY,0600); if (spd < 0) { perror(\”PARENT: my_new_open\”); exit(1); } rb = my_new_read(spd,buff,sizeof(buff)); if (rb > 0) write(1,rb); } else { spd = my_new_open(\”tmp_shm_pipe\”,O_WRONLY,0600); if (spd < 0) { perror(\”SON: my_new_open\”); exit(1); } my_new_write(spd,\”Hello World!n\”,sizeof(\”Hello World!n\”)); } my_new_close(spd); my_new_un_link(\”tmp_shm_pipe\”); my_new_finish(); return 0; }

我的问题是:

我怎么能使用上面的库的信号量,我不知道我会得到的main()程序?

我试图把信号量放在图书馆(不在main()程序中),但是效果不好。 你能解释我该怎么做才能正确?

备注:

请注意,这个main只是一个例子,我可以给予无数的其他main程序。

这是作业

非常感激

UNIX中的共享内存和信号量

共享内存:密钥和ID有什么区别?

NaCl和共享内存

C到C#(单声道)内存映射文件/共享内存在linux中

如何使用共享内存和信号量来实现pipe道?

在你的函数my_new_init你需要在共享内存中创建一个共享的semaphone – 但是要保护它,以便只调用一次; 这个警卫通常会使用一个模块的静态(或静态)变量在库模块中。

sem_t *my_semaphone; static int init = 0; int my_new_init() { if (!init) { my_semaphone = mmap(NulL,sizeof *my_semaphone,PROT_READ | PROT_WRITE,MAP_SHARED | MAP_ANONYMOUS,-1,0); if (!sem_init(my_semaphone,1,1)) { init = TRUE; } else perror(\”Sem_init\”); } return 1; // always successful }

然后在my_new_read顶部:

ssize_t my_new_read(int spd,voID *buf,size_t count) { char array[4096]; memset(array,\’\’,4096); ssize_t returnVal = 0; sem_wait(my_semaphone);

并在my_new_write发布后,你写了一些东西。

sem_post(my_semaphone); return returnVal;

以上可能需要改进,因为sem_wait可能会在数据准备好之前返回,所以在共享内存段开始时使用控制结构可能是明智的做法。

好吧,我会尽我所能,因为我不知道你对整个概念有多熟悉。

1)信号量最可能“正确”的地方在于读写功能。 要同步memorysegment上的进程,您必须将信号量也放在共享内存中。 (为了使他们能够访问所有进程)

http://pdfcast.org/download/semaphores-sharedmem.pdf

这是一个很好的,英文评论代码示例创建,使用和销毁信号量的pdf,与一个示例主。 它的标题是德语,但是那里没有其他东西不是C或者英语。

我希望它有帮助,而不是太“低级”你的技能^^

总结

以上是内存溢出为你收集整理的从共享内存段中读取和写入信号的地方在哪里?全部内容,希望文章能够帮你解决从共享内存段中读取和写入信号的地方在哪里?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

© 版权声明
THE END
喜欢就支持一下吧
点赞120 分享
评论 抢沙发

请登录后发表评论

    请登录后查看评论内容