2013-05-08 124 views
0

所以,我爲這個問題困惑了一個多小時。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 *),我在創建進程的主函數中定義了它(我想確保它沒有被銷燬或什麼)。

我很感激任何幫助。如果需要更多信息,請告訴我。

+1

這真的很難讀。我建議在一個更可讀的例子中隔離你的問題,而不是粘貼你在這裏工作的代碼。 – RandyGaul 2013-05-08 21:25:16

+1

謝謝,我現在嘗試編輯它 – 2013-05-08 21:26:04

+0

我已經添加了一些信息。如果你能告訴我哪個部分最令人困惑,我會盡量改進它 – 2013-05-08 21:34:01

回答

0

如果我正確地讀這篇文章,您通過這個領域的「返回」的值:

proc->has_waiting->ret_val 

,但你通過這個字段引用它:

proc->ret_val 

,你應該使用相同的參考在這兩個地方。

編輯:如何簡化此,使ret_val一個char *

+0

這是混亂的,但「has_waiting」也是一個過程,這是他RET_VAL我想部分的混亂2. 對不起閱讀。 (當proc是「has_waiting」進程時,第1部分 - >存儲到「has_waiting」進程中,第2部分 - >從has_waiting進程中讀取)。 – 2013-05-08 21:32:40

+1

所以你說'proc'確實是'proc-> has_waiting'? – jdigital 2013-05-08 21:33:27

+0

有很多線程。 proc是當前線程。 在第一部分中,一個線程(我們稱之爲thread1)正在設置另一個線程的ret_val。 在第2部分中,另一個線程(我們稱之爲thread2)試圖讀取它。 線程2也thread1-> has_waiting(據我已經驗證了這一點,我可以告訴)。 – 2013-05-08 21:37:34