各位看官們,大家好,上一回中咱們說的是使用管道進行進程間通信的例子,這一回咱們說的例子是:使用管道進行進程間通信,不過使用管道的方式不相同。閒話休提,言歸正轉。讓我們一起talk C栗子吧!
我們在前面章回中介紹了三種管道,這一回我們介紹第三種管道及其使用方法。最主要還是讓大家明白如何使用管道進行進程間的通信。
第三種管道我稱之為真正意義上的管道,該管道還有另外一個名字:命名管道(FIFO)。在介紹它之前,我們先介紹一個函數:mkfifo.
int mkfifo(const char *filename, mode_t mode)
該函數用來創建一個管道文件; 該函數的第一個參數是字符串,用來表示管道文件的名字; 該函數的第二個參數是文件訪問權限,用來表示管道文件的權限,例如:0764; 該函數會返回一個文件描述符,可以通過該文件描述符來操作管道; 該函數執行成功時返回0,否則返回-1。
明白這個函數的用法後,我們接下來介紹命名管道的使用方法.
我們可以看到,進程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”,父進程接著從管道中讀取了該數據,進而實現的了父子進程之間的數據傳輸,也就是進程之間的通信。
各位看官,關於使用信號進行進程間通信的例子咱們就說到這裡。欲知後面還有什麼例子,且聽下回分解 。