在做操作系統(tǒng)的實(shí)驗(yàn)過(guò)程中,自己安裝了Ubuntu(18.04.1)64位,在這里給大家安利一個(gè)VX公眾號(hào):軟件安裝管家。這里真的有好多好多的軟件,非常全面并且安裝教程非常詳細(xì),強(qiáng)烈推薦!!!
在此聲明,我所有代碼都是基于Ubuntu(18.04.1)64位,使用vim編輯器編輯,gcc編譯的。兼容性不知道如何。因?yàn)樽约阂彩莑inux新人,難免有一些不太準(zhǔn)確的地方,還希望和兄弟們交流學(xué)習(xí)。
實(shí)驗(yàn)應(yīng)該是要驗(yàn)證進(jìn)程之間的并發(fā)性,就是輸出字符的順序是不一定的,但是也許是由于代碼太簡(jiǎn)單的緣故,導(dǎo)致輸出順序每次都是固定的。。很是尷尬
#include<unistd.h>
#include<string.h>
#include<stdlib.h>
#include<stdio.h>
int main()
{
pid_t pid1,pid2;
pid1 = fork();//創(chuàng)建一個(gè)新process
if(pid1 < 0)
{
printf("創(chuàng)建進(jìn)程失敗!");
exit(1);
}
else if(pid1 == 0)
{
printf("b");
}
else
{
pid2 = fork();//創(chuàng)建第二個(gè)新進(jìn)程
if(pid2 < 0)
{
printf("進(jìn)程創(chuàng)建失敗!");
exit(1);
}
else if(pid2 == 0)
{
printf("c");
}
else
{
printf("a");
}
}
//getchar();//如果運(yùn)行錯(cuò)行,再放開(kāi)此句,攔住父進(jìn)程,不讓其結(jié)束
return 0;
}
更尷尬的是,這個(gè)代碼的運(yùn)行結(jié)果:
a居然打印在了那個(gè)地方???小弟剛開(kāi)始接觸linux,人都傻了,這是因?yàn)橹鬟M(jìn)程直接結(jié)束,它運(yùn)行速度甚至快于終端輸出??
我試著在代碼尾部加了getchar()攔截一下主進(jìn)程:
這下輸出就舒服多了。。。但是我運(yùn)行了很多遍,順序都是這樣,所以就改成for循環(huán)來(lái)打印,在每個(gè)進(jìn)程執(zhí)行過(guò)程中,用for循環(huán)打印數(shù)據(jù)。
#include<unistd.h>
#include<string.h>
#include<stdlib.h>
#include<stdio.h>
int main()
{
pid_t pid1,pid2;
pid1 = fork();//創(chuàng)建一個(gè)新process
if(pid1 < 0)
{
printf("創(chuàng)建進(jìn)程失敗!");
exit(1);
}
else if(pid1 == 0)
{
for(int i = 0;i<1000;i++)
{
printf("b 子進(jìn)程1的標(biāo)識(shí)符是%d",getpid());
}
}
else
{
pid2 = fork();//創(chuàng)建第二個(gè)新進(jìn)程
if(pid2 < 0)
{
printf("進(jìn)程創(chuàng)建失敗!");
exit(1);
}
else if(pid2 == 0)
{
for(int i = 0;i<1000;i++)
{
printf("c 子進(jìn)程2的標(biāo)識(shí)符是%d",getpid());
}
}
else
{
for(int i = 0;i<1000;i++)
{
printf("a 父進(jìn)程的標(biāo)識(shí)符是%d",getpid());
}
}
}
getchar();//為了攔住進(jìn)程,不讓進(jìn)程結(jié)束
return 0;
}
運(yùn)行結(jié)果:
交叉打印,感覺(jué)有那味了,并發(fā)執(zhí)行。
接下來(lái)又要求給進(jìn)程上鎖,使用lockf()函數(shù),這個(gè)原理基本就和Windows的臨界區(qū)是一個(gè)概念,申請(qǐng)到鎖的資源才可以執(zhí)行,并且在釋放資源之前,不會(huì)被其他進(jìn)程搶占這個(gè)資源,實(shí)現(xiàn)了進(jìn)程間同步機(jī)制。
附上代碼以及截圖:
#include<unistd.h>
#include<string.h>
#include<stdlib.h>
#include<stdio.h>
int main()
{
pid_t pid1,pid2;
pid1 = fork();//創(chuàng)建一個(gè)新process
if(pid1 < 0)
{
printf("創(chuàng)建進(jìn)程失敗!");
exit(1);
}
else if(pid1 == 0)
{
lockf(1,1,0);//上鎖
for(int i = 0;i<100;i++)
{
printf("Chile_1 子進(jìn)程1標(biāo)識(shí)是%d\r\n",getpid());
}
lockf(1,0,0);//解鎖
}
else
{
pid2 = fork();//創(chuàng)建第二個(gè)新進(jìn)程
if(pid2 < 0)
{
printf("進(jìn)程創(chuàng)建失敗!");
exit(1);
}
else if(pid2 == 0)
{
lockf(1,1,0);//上鎖
for(int i = 0;i<100;i++)
{
printf("Child_2 子進(jìn)程2標(biāo)識(shí)是%d\r\n",getpid());
}
lockf(1,0,0);//解鎖
}
else
{
lockf(1,1,0);//上鎖
for(int i = 0;i<100;i++)
{
printf("FatherProcess 父進(jìn)程標(biāo)識(shí)是%d\r\n",getpid());
}
lockf(1,0,0);//解鎖
}
}
getchar();//為了攔住進(jìn)程,不讓進(jìn)程結(jié)束
getchar();
return 0;
}
overrrrrr~~~