一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

Linux使用fork()方法創(chuàng)建進(jìn)程

 KookNut39 2021-12-15

在做操作系統(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~~~

    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多

    粗暴蹂躏中文一区二区三区| 九七人妻一区二区三区| 亚洲国产欧美精品久久| 91亚洲精品综合久久| 好吊一区二区三区在线看| 麻豆亚州无矿码专区视频| 午夜激情视频一区二区| 韩国激情野战视频在线播放| 亚洲妇女黄色三级视频| 狠狠干狠狠操亚洲综合| 国内自拍偷拍福利视频| 欧美日韩国内一区二区| 国产一级一片内射视频在线| 成人国产激情福利久久| 99久久精品视频一区二区| 五月天婷亚洲天婷综合网| 亚洲妇女黄色三级视频| 亚洲最大福利在线观看| 亚洲精选91福利在线观看 | 亚洲中文字幕日韩在线| 少妇激情在线免费观看| 国产精品亚洲综合天堂夜夜| 欧美区一区二在线播放| 99视频精品免费视频| 尹人大香蕉一级片免费看| 日本最新不卡免费一区二区| 日韩av欧美中文字幕| 精品日韩视频在线观看| 精品熟女少妇av免费久久野外| 丰满熟女少妇一区二区三区| 空之色水之色在线播放| 国产精品一区二区传媒蜜臀| 国产成人午夜福利片片| 午夜精品黄片在线播放| 国产小青蛙全集免费看| 久久天堂夜夜一本婷婷| 国内午夜精品视频在线观看| 国产精品蜜桃久久一区二区| 国产对白老熟女正在播放| 激情中文字幕在线观看| 日本和亚洲的香蕉视频|