2010-08-09 58 views
3

比方說,我有:sample.c文件沒有線程的比賽條件?

int main (...) { 

    char str*; 

    get s through user input 

    test(str); 

    return 0; 

} 

void test (str) { 

    copy str to new file 

    change file permissions on new file 

    close file 

} 

有沒有在這裏的比賽條件可能性,因爲我有我的main()方法沒有線程。真的嗎?

回答

8

有一種競爭條件,用戶可以在更改「新文件」的權限之前立即交換「新文件」。這是(被?)經常使用的安全漏洞。

我只看到尼爾巴特沃斯有一個相關的想法。

+0

謝謝Peter G和Neil Butterworth。 – 2010-08-09 16:34:00

+0

實際競爭條件是用戶可以在「新文件」中更改數據(「交換」文件取決於目錄權限),並且可以在創建「新文件」之前使用'umask()'關閉。 – ninjalj 2011-02-24 19:03:29

1

競爭條件的另一個來源是中斷和信號。如果兩者都不使用,則不會發生競態條件(有單個賽車手

+1

雖然您的答案在技術上是正確的,但每個具有先佔調度的操作系統都使用中斷來爲每個進程分配時間片。在這個程序中沒有明確的中斷代碼並不意味着不會發生中斷。 – Thomas 2010-08-09 16:20:57

6

有可能是比賽 - 兩個用戶可以同時運行您的程序。

+0

@ Neil-這種情況下的解決方案是什麼? – 2010-08-09 16:31:27

+0

@Praveen取決於文件系統。有些操作通常是原子操作,可用於鎖定邏輯。 – 2010-08-09 16:34:52

+0

您可以結合void test(str)的前兩個步驟來消除競爭條件嗎?或者,由於兩個用戶可以調用同一個程序,還是會出現競爭狀態? – 2010-08-09 17:12:06

0

任何時候您進行系統調用都有可能出現競爭狀況。這是因爲內核鏈接了系統上的所有線程,並允許進程之間的控制交互。在這種情況下,系統上的另一個線程可以訪問與您的應用程序相同的文件。