管道实现父子进程的信息传递(二)【标准流和其文件描述符、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函数】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【赛码网】求数列的和
- 下一篇: css实现下箭头