关于共享内存,子进程返回的问题。

feed124 2008-12-19 11:45:50
父进程对共享内存的数据进行操作,子进程读数据,读到*p=99的时候就退出。但是问题是发现,父进程退出之后,子进程无法退出。但是子进程的child is done都打印出来了啊.为何啊?
#include <sys/shm.h>
#include <sys/file.h>
#include <unistd.h>
#include <fcntl.h>
static int *getaddr(void)
{
key_t key;
int shmid, *p;

(void)close(open("shmseg", O_WRONLY | O_CREAT, 0));
key = ftok("shmseg", 1);
shmid = shmget(key, sizeof(int), IPC_CREAT);
p = shmat(shmid, NULL, 0);
return p;

}
运行结果:
The address of share memory at son is 16941787.
child saw 1
The address of share memory at parent is 16941787.
child saw 2
child saw 3
parent exit
[root@localhost Unix_work_test]# child saw 99
child is done


int main(void)
{
pid_t pid;

if ((pid = fork()) == 0) {
int *p, prev = 0;

p = getaddr();
printf("The address of share memory at son is %d.\n");
*p=1;
while (*p != 99)
if (prev != *p) {
printf("child saw %d\n", *p);
prev = *p;
}
printf("child is done\n");
exit(0);
}
else {
int *p;

p = getaddr();
printf("The address of share memory at parent is %d.\n");
for (*p = 1; *p < 4; (*p)++)
sleep(1);
*p = 99;
}
printf("parent exit\n");
exit(0);

}
...全文
113 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
feed124 2008-12-20
  • 打赏
  • 举报
回复
貌似可以了。
  • 打赏
  • 举报
回复
2楼这种状况应该还是僵尸进程吧.父进程还得wait一下啊.这样应该算是搞定了.
caremsi 2008-12-19
  • 打赏
  • 举报
回复
else {
int *p;

p = getaddr();
printf("The address of share memory at parent is %d.\n");
for (*p = 1; *p < 4; (*p)++)
sleep(1);
*p = 99;
}
sleep(4); //不让父进程在子进程退出前退出
printf("parent exit\n");
exit(0);

}

加了一条,就可以了.觉得应该是因为父进程过早退出导致子进程无法返回,应该被1号进程收为子进程了.

3,881

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧