我目前正在練習使用 fork 將一些行寫入共享記憶體并在列印完所有行后終止。據我了解,在程式終止 shmdt 和 shmctl 后,一旦執行,就會洗掉共享記憶體位置。我有這兩個陳述句,并且在我的程式結束后,我仍然可以從運行程式中看到共享記憶體位置。為了澄清起見,我在終端中運行 killall -u 然后 ipcrm --all 以確保我在運行時沒有共享記憶體位置。在我運行之后,應該沒有記憶體位置。
#include <stdio.h>
#include <sys/shm.h>
#include <sys/stat.h>
int
main()
{
int pid;
int segment_id;
char *shared_memory="User";
const int segment_size = 4096;
segment_id = shmget(IPC_PRIVATE, segment_size, S_IRUSR | S_IWUSR);
shared_memory = (char *) shmat(segment_id, NULL, 0);
sprintf(shared_memory, "I am process A");
printf("%s\n", shared_memory);
if (fork() == 0) {
sprintf(shared_memory, "I am process B");
printf("%s\n", shared_memory);
pause();
exit(0);
} else {
if (fork() == 0){
sprintf(shared_memory, "I am process C");
printf("%s\n", shared_memory);
pause();
exit(0);
}else{
usleep(100);
exit(0);
}
}
if (shmdt(shared_memory) == -1) {
fprintf(stderr, "Unable to detach\n");
}
shmctl(segment_id, IPC_RMID, NULL);
return 0;
}
uj5u.com熱心網友回復:
TL;DR:向您的子行程發送信號exit(0)
,并在您的之后洗掉usleep(100)
您的父行程創建段,然后分叉。pause()
等待信號的分叉行程呼叫- 似乎沒有一個即將到來。
if/else/[if/else] 的最后一個分支休眠然后退出,因此您的嘗試shmdt()
永遠不會執行。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/431186.html
上一篇:如何將字串作為宏傳遞?