Итак, я озадачен этой проблемой более часа.c возвращаемое значение через параметры
фона:
У меня есть реализация потоков ядра в xv6, что я хочу, чтобы проверить.
Потоки связывают возвращаемые значения через поле ret_val.
Каждый поток сохраняет возвращаемое значение в в другой ветке ret_val (потому что он может технически быть выделен после возврата значения).
У меня есть две части в моем коде, которые не работают, как я ожидал.
* Примечания: поле процес-> ret_val имеет тип аннулируются ** поле процес-> has_waiting имеет тип STRUCT Proc *
Часть 1 (это та часть, которая хранит возвращаемое значение в структурах текущего процесса):
// store value in WAITING THREAD's ret_val.
(*proc->has_waiting->ret_val) = (void*)ret_val;
cprintf("(t_exit)process %d is taking the return value %s\n", proc->pid, (char *)ret_val);
cprintf("(t_exit)process %d now has return value from %d -> %s\n", proc->has_waiting->pid, proc->pid, (char *)(*proc->has_waiting->ret_val));
работа в этом^Пярте для хранения значения в отставке процесса, в _val (внутри поля has_waiting, которое является указателем на структуру процесса).
Это похоже на работу, потому что отпечатки указывают, что значение действительно сохранено.
Часть 2 (это та часть, которая пытается читать STRUCT ret_val поле процесса в):
cprintf("(t_join) process %d is taking the return value %s\n", proc->pid, (char *)(*proc->ret_val));
* ret_val = proc->ret_val; // it's t's duty to set proc's ret_val
работа в этом^Пярта является восстановление значения внутри структуры структуры (в ret_val поле), прежде чем он будет уничтожен ,
Часть 2 не работает, поле ret_val пуст.
Я пробовал всевозможные манипуляции с кастом, но, похоже, я неправильно понимаю базовую концепцию.
Я проверил структуру, к которой я обращаюсь, является правильной структурой, распечатав ее идентификатор (уникальный).
Значение, которое я передаю (в ret_val), представляет собой статическую строку (char *), которую я определил в основной функции, которая создает процессы (я хотел убедиться, что она не уничтожена или что-то еще).
Буду признателен за любую помощь. Если вам нужна дополнительная информация, дайте мне знать.
Это действительно трудно прочитать. Я предлагаю изолировать вашу проблему в более удобочитаемом надуманном примере вместо вставки кода, с которым вы работаете здесь. – RandyGaul
спасибо, сейчас я попробую его отредактировать –
Я добавил некоторую информацию. Если бы вы могли сказать мне, какая часть наиболее запутанна, я попытаюсь ее улучшить. –