2013-02-26 87 views
2

我想實現一個功能,使循環不斷迭代,並同時從用戶獲取輸入(如果可用)。 我已經實現了以下代碼,但打印時未反映已掃描變量「a」的值。c中的非阻塞輸入

pid_t pid; 
pid=fork(); 
if(pid == 0) 
{ 
    while(1) 
    { 
     printf("%d\n",a); 
     sleep(1); 
    } 
} 
else 
{ 
    while(1) 
    { 
     scanf("%d",&a); 
    } 
} 
+4

哦,親愛的......在一個過程中發生的事情不能影響其他過程中的變量。這些是進程,而不是單個進程內的線程。 – 2013-02-26 07:32:30

回答

2

當你做fork()時,子進程會被創建爲程序的共享文本區域,但創建子進程的數據和堆棧段與父進程不同,所以子進程總是打印a = 1。

3

那是因爲你有兩個單獨的進程使用fork()。如果你想遵循這種方法,你將需要使用線程。

0

在這種情況下,您會得到兩個不同的進程,每個進程都有它自己的a。您可以使用Linux pipes

0

如果您使用fcntl()將stdin標記爲非阻塞,然後在循環中執行您所需的操作並嘗試讀取,則速度會更快,如果沒有可用的數據並且將數據存儲在緩衝區是否可用。這將使用100%的CPU壽命。要檢查數據是否可用,你應該使用select()。

0

您也可以使用共享內存,但必須使用信號量來同步對共享內存段的訪問。