gpt4 book ai didi

c - main函数在返回0后不会退出,shmctl不会删除段

转载 作者:行者123 更新时间:2023-11-30 15:52:37 25 4
gpt4 key购买 nike

我尝试使用共享内存作为管道,但遇到了几个问题:

  1. 我无法删除该片段
  2. return 0之后main函数没有退出

    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 的手册页中写到 After a fork(2) the child inherits the attached shared memory segments.

所以我尝试使用shmdt两次,在父亲和 child 上,但后来我得到一个错误

Invalid argument

main()打印“end main”后卡住我尝试使用 ipcs -m 查看共享内存的状态,我看到nattch是 1,并且 key是 0...只有在我ctrl+c之后main() ,从 ipcs -m 中删除内存段

我不确定我应该提供哪些进一步的信息。我没有写所有的函数,因为它太多了,我认为这并不重要......

最佳答案

我怀疑你对某些事情感到困惑。

the last output is "end main"

shm_pipe_close() free's the pointer to the segment and deletes the segment

然而,正如所写的——子 block 中没有exit——此代码应该在父 block 和子 block 中运行:

  shm_pipe_close(spd[0]);
shm_pipe_close(spd[1]);
printf("end main\n");

换句话说,两次(除非子进程在 shm_pipe_read 中停滞,见下文)。如果“删除段”指的是单个共享内存实体,这可能是无意的。

除此之外,您的结果取决于 shm_pipe_readshm_pipe_write 是否像管道上的正常阻塞读/写调用一样工作,这些调用会等待数据被读取或写在另一端。我猜你的写肯定不是这样的,读起来也可能不是这样。

这意味着 shm_pipe_write 可能发生在父级中,然后“管道”(实际上是共享内存段)被立即删除。如果这导致 shm_pipe_read 中的某些内容停止(因为该段消失了),它可能(如ring0在评论中所说)解释了您的问题。

关于c - main函数在返回0后不会退出,shmctl不会删除段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14282443/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com