我正在尝试将共享内存用作管道,但遇到了几个问题:
- 我无法删除分段
主函数不退出,之后
return 0
int main() { int spd[2], pid, rb; char buff[4096]; if (shm_pipe_pipe(spd) < 0) { perror("shm_pipe_pipe"); exit(1); } if (fork()) { rb = shm_pipe_read(spd[0], buff, sizeof(buff)); if (rb > 0) write(1, buff, rb); } else { shm_pipe_write(spd[1], "hello world!\n", sizeof("hello world!\n")); } shm_pipe_close(spd[0]); shm_pipe_close(spd[1]); printf("end main\n"); return 0; }
最后一个输出是“end main”,但程序没有关闭并返回 bash ......我肯定它与整个共享内存有关:
shm_pipe_pipe()
分配共享内存段和指向共享内存的指针:
shmid = shmget(key, PIPE_SIZE, IPC_CREAT | IPC_EXCL | 0600);
buffer = (char*)shmat(pipes_array[i].m_shmid, NULL, 0)) == NULL)
shm_pipe_write
and shm_pipe_read
只需执行 memcpy() 到/从共享内存
shm_pipe_close()
free 是指向该段的指针并删除该段:
shmdt(buffer);
shmctl(shmid, IPC_RMID, NULL);
我不明白为什么它不起作用。
它写在 shmdt 的手册页中,经过fork(2) the child inherits the attached shared memory segments.
所以我尝试shmdt
在父亲和孩子上使用两次,但后来出现错误
Invalid argument
当main()
打印“end main”后卡住时,我尝试查看共享内存的状态ipcs -m
,我看到nattch
是 1,然后key
是 0...只有在我之后ctrl+c
main()
,内存段才被删除ipcs -m
我不确定我应该带来什么进一步的信息。我没有写所有的功能,因为这很多,我认为这不重要......