gpt4 book ai didi

c - C 中的链表丢失头部信息

转载 作者:太空宇宙 更新时间:2023-11-04 06:08:49 25 4
gpt4 key购买 nike

作为开发简单 shell 项目的一部分,我已经在 C 中实现了一个基本链表 - 它通过维护 shell 在后台运行的 pid 列表来支持进程后台运行。代码如下。使用 queue_process(some_pid) 插入第一次工作正常,但随后链表就像列表中从来没有任何节点一样(即“没有现有进程”总是由调试功能打印).我已经检查了这个文件和调用这些函数的文件是否有任何会重置头指针无用的东西。我是否在链表逻辑中遗漏了什么?

调用 queue_process EDIT: 发生在由 shell 启动的子进程中,看起来像这样/EDIT: queue_process(getpid())

谢谢!

    void queue_process(pid_t pid_to_insert)
{
pmesg(2, "In queue_process.\n");
if (head == NULL)
{
pmesg(3, "No existing processes.\n");
head = malloc(sizeof(struct xssh_process));
head->pid = pid_to_insert;
head->next = NULL;
}
else
{
pmesg(3, "There are existing processes.\n");
struct xssh_process *new_process = malloc(sizeof(struct xssh_process));
new_process->next= head;
head = new_process;
}
print_processes();
}

void print_processes()
{
pmesg(2, "In print_processes.\n");
struct xssh_process *at_node = head;
if (head == NULL) { pmesg(2, "There are currently no background processes.\n"); return; }
pmesg(2, "Process IDs from head (most recently executed) to tail: %i -> ", at_node->pid);
while (at_node != NULL)
{
pmesg(2, "%i ->", at_node->pid);
at_node = at_node->next;
}
pmesg(3, "Head's pid in print is %i.\n", head->pid);
}

最佳答案

对于您遇到的错误没有任何帮助,但您的代码让我觉得过于复杂:

pmesg(2, "In queue_process.\n");
if (head == NULL)
{
pmesg(3, "No existing processes.\n");
head = malloc(sizeof(struct xssh_process));
head->pid = pid_to_insert;
head->next = NULL;
tail = malloc(sizeof(struct xssh_process));
tail = head;
}
else
{
pmesg(3, "There are existing processes.\n");
struct xssh_process *new_process = malloc(sizeof(struct xssh_process));
new_process->next= head;
head = new_process;
}

这可以简化很多。由于无论如何您都是在列表的头部插入,因此您不需要为空列表单独的逻辑:

void queue_process(pid_t pid_to_insert) { 
struct xssh_process *new_process = malloc(sizeof(*new_process));
new_process->pid = pid_to_insert;
new_process->next = head;
head = new_process;
}

同样,print_processes 可以稍微精简一下:

void print_processes() { 
struct xssh_process *p;
for (p=head; p!=NULL; p=p->next)
printf("%d\n", p->pid);
}

OTOH,链表让我觉得是一个糟糕的选择——假设指针至少和 PID 一样大,至少 50% 的内存是指针的开销。

关于c - C 中的链表丢失头部信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4859283/

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