程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 一起talk C栗子吧(第九十回:C語言實例--使用管道進行進程間通信三)

一起talk C栗子吧(第九十回:C語言實例--使用管道進行進程間通信三)

編輯:關於C語言

一起talk C栗子吧(第九十回:C語言實例--使用管道進行進程間通信三)



各位看官們,大家好,上一回中咱們說的是使用管道進行進程間通信的例子,這一回咱們說的例子是:使用管道進行進程間通信,不過使用管道的方式不相同。閒話休提,言歸正轉。讓我們一起talk C栗子吧!

我們在前面章回中介紹了三種管道,這一回我們介紹第三種管道及其使用方法。最主要還是讓大家明白如何使用管道進行進程間的通信。

第三種管道我稱之為真正意義上的管道,該管道還有另外一個名字:命名管道(FIFO)。在介紹它之前,我們先介紹一個函數:mkfifo.

mkfifo函數的原型

int mkfifo(const char *filename, mode_t mode)
該函數用來創建一個管道文件; 該函數的第一個參數是字符串,用來表示管道文件的名字; 該函數的第二個參數是文件訪問權限,用來表示管道文件的權限,例如:0764; 該函數會返回一個文件描述符,可以通過該文件描述符來操作管道; 該函數執行成功時返回0,否則返回-1。

明白這個函數的用法後,我們接下來介紹命名管道的使用方法.

mkfifo函數的用法

1.使用mkfifo函數創建一個命名管道; 2.在進程A中使用open打開管道(打開方式為寫),這時會得到一個fd; 3.使用write通過fd在管道中寫入數據; 4.使用close關閉步驟2中得到的fd; 5.在進程B中使用open打開管道(打開方式為讀),這時會得到一個fd; 6.使用read通過fd從管道中讀取數據; 7.使用close關閉步驟5中得到的fd;

我們可以看到,進程A在mkfifo創建的管道中寫入數據,進程B從該管道中讀取數據。進程A和B通過該管道實現了進程之間的通信,通信的內容為數據。

我們接下來使用具體的例子進行說明,下面是詳細的代碼

int main()
{
    char input[] = "IPC by pipe";
    char output[BUFSIZ+1];
    char p_name[] = "/tmp/test_fifo";
    int count = 0;
    int fd;
    int stat_value;
    pid_t pid,pid_res;

    memset(output,'\0',sizeof(output));

    if(mkfifo(p_name,0777) == 0) // create pipe
    {
        pid = fork();
        if(pid > 0)
        {
            printf("father running \n");
            fd = open(p_name,O_RDONLY); //open by read mode
            if(fd == -1)
            {
                printf("open pipe file failed \n");
                return 1;
            }
        }
        else if(pid == 0)
        {
            printf("son running \n");
            fd = open(p_name,O_WRONLY); //open by write mode
            if(fd == -1)
            {
                printf("open pipe file failed \n");
                return 1;
            }

            count = write(fd,input,strlen(input));    // write the dato into pipe
            printf("son process write %d characters,they are : %s \n",count,input);
            close(fd);
        }
        else
        {
            printf("create process failed \n");
            return 1;
        }
    }
    else
    {
        printf("create fifo failed \n");
        return 1;
    }

        pid_res = wait(&stat_value);

        if(pid_res > 0)
        {
            count = read(fd,output,BUFSIZ);       // read the data from pipe
            printf("father process read %d characters,they are: %s \n",count,output);

            close(fd);
        }

    return 0;
}

通過上面的代碼,大家可以發現,我們首先創建了一個命名管道,然後用fork創建了子進程,並且在子進程中向管道中寫入數據,接著在父進程中讀取數據,不過父進程使用wait函數等待子進程寫入數據後才去管道中讀取數據。這便是進程之間互斥的應用。如果不這樣做的話,父進程從管道中讀取數據時,子進程還沒有把數據寫入管道。

看官們,正文中就不寫代碼了,詳細的代碼放到了我的資源中,大家可以點擊這裡下載使用。

下面是程序的運行結果,請大家參考:

./s                                                       //運行編譯後的程序
father running                                            //父進程在運行
son running                                               //子進程在運行
son process write 11 characters,they are : IPC by pipe    //子進程向管道中寫入數據
father process read 11 characters,they are: IPC by pipe   //父進程從管道中讀取數據

我們通過上面的程序運行結果可以看到,子進程在管道中寫入了數據“IPC by pipe”,父進程接著從管道中讀取了該數據,進而實現的了父子進程之間的數據傳輸,也就是進程之間的通信

各位看官,關於使用信號進行進程間通信的例子咱們就說到這裡。欲知後面還有什麼例子,且聽下回分解 。


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved