各位看官們,大家好,上一回中咱們說的是父進程與子進程的例子,這一回咱們說的例子是:進程互斥。閒話休提,言歸正轉。讓我們一起talk C栗子吧!
我們在上一回中介紹了父進程與子進程的例子,這一回,我們說的是進程之間的互斥。所謂的互斥就是指兩個進程按照一定的順序使用臨界資源。比如鍵盤就是一種臨界資源。如果父進程在使用的時候,子進程需要等待,直到父進程使用完後,它才能使用。接下來,我們通過一個實際的例子進行說明:
int main()
{
pid_t pid;
pid_t pid_res;
int count = 0;
int stat_value;
pid = fork();
if(pid > 0)
{
printf("PID: %d -> Father Process is running \n",getpid());
count++;
printf("count is %d in Father Process \n",count);
}
else if(pid == 0)
{
printf("PID: %d -> Son Process is running \n",getpid());
count++;
printf("count is %d in Son Process \n",count);
}
else
{
printf("Create process failed \n");
return 1;
}
return 0;
}
我們把編譯上面的代碼並且運行,可以得到以下結果:
./s //運行編譯後的程序
PID: 3030 -> Father Process is running
count is 1 in Father Process //父進程在使用count這種臨界資源
PID: 3031 -> Son Process is running
count is 1 in Son Process //子進程在使用count這種臨界資源
在上面的代碼中,我們使用count模仿臨界資源,從程序的運行結果可以看到,父進程和子進程,對count的使用沒有任何聯系,它們幾乎是同時使用該臨界資源,沒有一定的順序。(當然,count在程序中不是真正的臨界資源,我們只是在模仿)。
如果想讓進程之間按照一定的順序使用臨界資源,那麼可以使用wait函數。它通常在父進程中使用,在父進程中使用wait函數後,它會一直等待子進程運行,直到子進程運行結束了,它才開始運行父進程中的內容。下面是我們使用wait後的代碼:
int main()
{
pid_t pid;
pid_t pid_res;
int count = 0;
int stat_value;
pid = fork();
if(pid > 0)
{
printf("PID: %d -> Father Process is running \n",getpid());
pid_res = wait(&stat_value); //使用wait函數實現進程互斥
if(pid_res > 0) //等待子進程結束後,再使用臨界資源
{
printf("Son process finished: PID = %d \n",pid_res);
count++;
printf("count is %d in Father Process \n",count);
}
}
else if(pid == 0)
{
printf("PID: %d -> Son Process is running \n",getpid());
count++;
printf("count is %d in Son Process \n",count);
}
else
{
printf("Create process failed \n");
return 1;
}
return 0;
}
下面是程序的運行結果,請大家和沒有使用wait函數的運行結果進程對比。
./s //運行編譯後的程序
PID: 3073 -> Father Process is running //父進程沒有使用count這種臨界資源
PID: 3074 -> Son Process is running
count is 1 in Son Process //子進程在使用count這種臨界資源
Son process finished: PID = 3074 //子進程結束
count is 1 in Father Process //父進程在使用count這種臨界資源
看官們,正文中就不寫代碼了,詳細的代碼放到了我的資源中,大家可以點擊這裡下載使用。
各位看官,關於進程互斥的例子咱們就說到這裡。欲知後面還有什麼例子,且聽下回分解。