2013-11-15 47 views
0

我在寫一個程序來計算終端,我寫了另一個只輸入並打印出來的虛擬程序。 dummy prog:在Linux中的兩個進程之間的上下文切換

int main(int argc, char *argv[]) { 
char text[128] = {0}; 
while(1){ 
    fgets (text, 128, stdin); 
    printf("%s\n", text); 
} 
return 0; 
} 

在我的主程序中,我用fork-> exec運行虛擬程序。我的問題是他們中的哪一個從用戶那裏獲得輸入?在它們之間是否有上下文切換,以便一個進程一次接受輸入,否則父進程將接受所有輸入,除非我呼叫等待。

編輯:輸入不會被共享。

然後我想調用子進程到前臺我嘗試使用tcsetpgrp但沒有成功。我做到以下幾點:

if((son = fork())==0){//son process 
}else{//father 
printf("the old group id is:%d\n", getpgid(son)); 
setpgid(son,son); 
k = printf("the new group id is:%d\n",getpgid(son)); 
j = tcgetpgrp(0, getpgid(son)) 
} 

j被設置爲25位的setpgrp之前的一些原因和兩個PGID和之後是相同的。

+1

您應該*閱讀'fork'和'exec'的手冊*,並找出自己打開文件描述符(如標準輸入)會發生什麼情況。 –

+0

你好那裏,我的問題是沒有與叉執行,但與防止和允許輸入的新進程 –

+1

您的問題最終是關於什麼發生在標準輸入。這被記錄爲'fork'和'exec'行爲的一部分。 –

回答

1

主程序連接到終端並獲取輸入。如果您使用線程而不是創建分支,則將在線程之間共享I/O。

如果只有一個線程讀取,它將獲取所有輸入。如果兩個或多個線程讀取,他們不共享數據,並且結果是不可預知的。