所以,我爲這個問題困惑了一個多小時。c通過參數返回值
背景:
我有內核線程的xv6,我想測試的實現。
線程通過字段ret_val傳遞返回值。
每個線程都會將返回值保存在另一個線程的 ret_val(因爲它在技術上可以在返回值後解除分配)。
我在我的代碼中有兩個部分不能像我期望的那樣工作。
*注: 的字段 PROC-> RET_VAL中類型的無效** 的字段 PROC-> has_waiting是類型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));
此^部分的工作是將值存儲在進程的ret中_val(在「has_waiting」字段內,這是一個指向進程結構的指針)。
這似乎工作,因爲打印指示值確實保存。
第2部分(這是試圖讀取過程中的結構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字段爲空。
我試過各種鑄造操作,但似乎我誤解了這裏的一個基本概念。
我驗證了我正在尋址的結構是通過打印出它的id(唯一的)來正確的結構。
我傳遞的值(在ret_val中)是一個靜態字符串(char *),我在創建進程的主函數中定義了它(我想確保它沒有被銷燬或什麼)。
我很感激任何幫助。如果需要更多信息,請告訴我。
這真的很難讀。我建議在一個更可讀的例子中隔離你的問題,而不是粘貼你在這裏工作的代碼。 – RandyGaul 2013-05-08 21:25:16
謝謝,我現在嘗試編輯它 – 2013-05-08 21:26:04
我已經添加了一些信息。如果你能告訴我哪個部分最令人困惑,我會盡量改進它 – 2013-05-08 21:34:01