日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

管道实现父子进程的信息传递(二)【标准流和其文件描述符、fwrite函数、perror函数】

發布時間:2023/12/13 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 管道实现父子进程的信息传递(二)【标准流和其文件描述符、fwrite函数、perror函数】 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 代碼實現
  • 標準流 和 標準流文件描述符
  • 代碼中用到的函數
    • fwrite()
    • perror()


在復習進程間的通信方式時又寫了一遍,和 管道實現父子進程的信息傳遞(一)【fork函數、pipe函數、write/read操作、wait函數】 的區別不是特別大,只是具體介紹了 (一) 中沒有介紹到的知識點。

代碼實現

#include<iostream> #include<unistd.h> // pipe(),fork(),STDOUT_FILENO #include<sys/wait.h> // wait() #include<cstdio> // fprintf() #include<stdio.h> // perror(),stdoutusing namespace std;# define MAXLINE 100int main(){int fd[2];char buff[MAXLINE];if(pipe(fd) < 0){perror("pipe error!");exit(1);}pid_t pid = fork();if(pid < 0){fprintf(stderr, "fork error!");exit(1);}if(pid == 0){close(fd[1]);while(1){int len = read(fd[0], buff, MAXLINE);fwrite(buff, sizeof(char), len, stdout);}close(fd[0]);exit(0);}else{close(fd[0]);while(1){write(fd[1], "I Love CMY!\n", 12);sleep(2);}close(fd[1]);wait(NULL);}return 0; }

輸出結果:

運行后每兩秒寫端會寫入數據,然后讀端立即讀入數據。


標準流 和 標準流文件描述符

編程過程中我們常會用到 標準流 ,以 標準輸入流 為例:

  • 標準輸入的文件描述子為 0
  • POSIX <unistd.h> 定義是 STDIN_FILENO
  • <stdio.h> 變量為 FILE* stdin ;
  • <iostream> 變量為 std::cin

前兩者常被稱為 標準輸出文件描述符 ,而后兩者被稱為 標準輸出流

在 Linux 中,標準流,是 FILE* 類型,屬于系統的 I/O 設備,是標準I/O:

  • 標準輸入 stdin
  • 標準輸出 stdout
  • 標準錯誤 stderr

使用標準流的函數主要有:fread、fwrite、fclose 等,基本上都以 f 開頭。

標準流的文件描述符,是非負整數(int類型),屬于系統 API 接口庫,是沒有 buffer 的 I/O ,直接調用系統調用,:

  • 標準輸入文件描述符 STDIN_FILENO
  • 標準輸出文件描述符 STDOUT_FILENO
  • 標準錯誤文件描述符 STDERR_FILENO

使用標準流的文件描述符的函數有:read、write、close 等。


代碼中用到的函數

fwrite()

fwrite 是 C 語言標準庫 中的一個文件處理函數,功能是:向指定的文件中寫入若干數據塊,如成功執行則返回實際寫入的數據塊數目。該函數以二進制形式對文件進行操作,不局限于文本文件。

size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream)

ptr —— 這是指向要被寫入的元素數組的指針。
size —— 這是要被寫入的每個元素的大小,以字節為單位。
nmemb —— 這是元素的個數,每個元素的大小為 size(第二個參數) 字節。
stream —— 這是指向 FILE 對象的指針,該 FILE 對象指定了一個輸出流。

perror()

perror 用來將上一個函數發生錯誤的原因輸出到標準設備(stderr)。

void perror ( const char * str );

參數 str 所指的字符串會先打印出,后面再加上錯誤原因字符串。此錯誤原因依照全局變量 errno 的值來決定要輸出的字符串。

范例:

#include<stdio.h> int main(void) {FILE *fp;fp=fopen("/root/noexitfile","r+");if(NULL==fp){perror("/root/noexitfile");}return 0; }

運行結果:

[root@localhost io]# gcc perror.c [root@localhost io]# ./a.out /root/noexitfile: No such file or directory

總結

以上是生活随笔為你收集整理的管道实现父子进程的信息传递(二)【标准流和其文件描述符、fwrite函数、perror函数】的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。