尝试使用子进程向匿名共享内存写入消息,然后终止它。然后让父母读取消息。我已经看到了映射输入和放大器的示例。使用通过read
&获得的文件描述符输出文件write
来电。但不知道如何正确处理这个问题。
int main(void) {
char *shared;
int status;
pid_t child;
shared = mmap(0, sizeof(int) , PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANON, -1, 0);
if (shared == MAP_FAILED) {
perror("mmap");
return 1;
}
child = fork();
if ( child == -1 ) {
perror("fork");
return 1;
} else if (child == 0) {
sprintf(shared, "foo");
} else {
printf("%s", shared);
wait(&status);
}
if (munmap (shared, sizeof(int)) == -1) {
perror("munmap");
return 1;
}
return 0;
}
答案 0 :(得分:1)
如果您打算使用共享内存,那么尝试通过基础文件上的<script>
$('#TextBox1').blur(function() {
var sourceElement = document.getElementById("TextBox1");
var targetElement = document.getElementById("TextBox2");
targetElement.value = sourceElement.value;
});
</script>
和read()
调用来操纵它是愚蠢的(无论如何都不存在匿名映射) )。如果您想通过write()
和read()
进行通信,那么只需创建一个管道,忘记映射和共享内存。这实际上是一种完全可行的方法。
如果你真的想为此使用共享内存,那么就像 memory 一样使用它。将指向共享内存区域的指针转换为适当的指向对象类型,使用普通赋值进行写入,并使用普通变量/内存访问进行读取。共享内存确实引入了冲突访问和同步的潜在问题,但即使对于您描述的简单情况也没有什么大不了的:只需让父进程成功write()
为子进程(或以其他方式通知其终止)试图阅读孩子所写的一切。
您确实如何设置映射,但是:您映射wait()
个字节,但这可能不足以映射您尝试写入的消息。总的来说,看起来应该更像这样:
sizeof(int)
答案 1 :(得分:0)
如果您的唯一目标是在子进程和父进程之间进行读/写,那么使用管道是一种更容易实现的方法。它看起来像这样:
int fd[2];
pipe(fd);
if((child= fork()) == -1)
{
perror("fork");
exit(1);
}
if(child == 0)
{
// close read side
close(fd[0]);
// write to pipe
write(fd[1], msg, (strlen(msg));
}
else
{
//close write side
close(fd[1]);
//read what the child wrote.
nbytes = read(fd[0], buff, sizeof(buff));
}