共有メモリをパイプとして使用しようとしていますが、いくつかの問題が発生します。
- セグメントを削除できません
メイン関数は終了しません。
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 の man ページには、fork(2) the child inherits the attached shared memory segments.
shmdt
そのため、父と子で2回使用しようとしましたが、エラーが発生しました
Invalid argument
main()
「end main」を印刷した後にスタックが発生した場合、で共有メモリのステータスを確認しようとするとipcs -m
、それnattch
が 1 であり、key
が 0 であることがわかります... I の後でのみctrl+c
main()
、メモリセグメントはから削除されますipcs -m
さらにどのような情報を提供すればよいかわかりません。私はすべての関数を書いたわけではありません。それはたくさんあり、問題ではないと思います...