2012-04-22 105 views
0

我基本上遇到了我寫的系統調用中非常奇怪的情況。我想檢查一些值,如果它們是相同的返回-2表示發生了某種類型的錯誤。我正在使用printk()在我的「else if」之前打印這些變量的值,它表示它們彼此相等,但條件未被執行(即,我們不輸入else if)I對於在內核中工作是一個相當新的東西,但這對我來說似乎非常陌生,並且想知道在內核中是否存在一些細微差別,我不知道如果有人可以冒險猜測爲什麼如果我知道我的價值變量條件將不會執行我真的很感激你的幫助linux內核+條件語句

// -------------------------------- ------- //

/* sys_receiveMsg421() 
    Description: 
    - Copies the first message in the mailbox into <msg> 
*/ 
asmlinkage long sys_receiveMsg421(unsigned long mbxID, char *msg, unsigned long N) 
{ 

int result = 0; 
int mboxIndex = checkBoxId(mbxID); 
int msgIndex = 0; 

//acquire the lock 
down_interruptible(&sem); 

//check to make sure the mailbox with <mbxID> exists 
if(!mboxIndex) 
{ 
    //free our lock 
    up(&sem); 
    return -1; 
} 

else 
    mboxIndex--; 

printk("<1>mboxIndex = %d\nNumber of messages = %dCurrent Msg = %d\n",mboxIndex, groupBox.boxes[mboxIndex].numMessages, groupBox.boxes[mboxIndex].currentMsg); 

//check to make sure we have a message to recieve 

-----------CODE NOT EXECUTING HERE------------------------------------------------ 
if(groupBox.boxes[mboxIndex].numMessages == groupBox.boxes[mboxIndex].currentMsg) 
{ 
    //free our lock 
    up(&sem); 
    return -2; 
} 
//retrieve the message 
else 
{ 
    //check to make sure the msg is a valid pointer before continuing 
    if(!access_ok(VERIFY_READ, msg, N * sizeof(char))) 
    { 
     printk("<1>Access has been denied for %lu\n", mbxID); 
     //free our lock 
     up(&sem); 
     return -1; 
    } 
    else 
    { 
     //calculate the index of the message to be retrieved    
     msgIndex = groupBox.boxes[mboxIndex].currentMsg;  

     //copy from kernel to user variable  
     result = copy_to_user(msg, groupBox.boxes[mboxIndex].messages[msgIndex], N); 

     //increment message position 
     groupBox.boxes[mboxIndex].currentMsg++; 

     //free our lock 
     up(&sem); 

     //return number of bytes copied 
     return (N - result); 
    } 
} 
} 

更新:通過僅改變返回值到別的解決我的問題,並能正常工作非常堰d

回答

4

請記住使用標點符號;我不喜歡在閱讀問題時喘不過氣來。

你知道,如果沒有被輸入塊?在那裏的一個printk(和另一個在另一個塊中)會讓你更進一步,不是嗎?

至於這個問題:沒有,沒有特定的內核代碼,這將使這個不行什麼。

而且你似乎有同步覆蓋,太。雖然:我看到你在關鍵部分之外獲得mboxIndex。這會導致問題嗎?從這個片段中很難看出,它甚至沒有聲明groupBox

1

也許numMessages和/或currentMsg定義爲long
如果是這樣,你printk,它採用%d,將打印只是位一些,所以你可能會認爲他們是平等的,而事實並非如此。