管道实现父子进程的信息传递(二)【标准流和其文件描述符、fwrite函数、perror函数】
文章目錄
- 代碼實(shí)現(xiàn)
- 標(biāo)準(zhǔn)流 和 標(biāo)準(zhǔn)流文件描述符
- 代碼中用到的函數(shù)
- fwrite()
- perror()
在復(fù)習(xí)進(jìn)程間的通信方式時(shí)又寫了一遍,和 管道實(shí)現(xiàn)父子進(jìn)程的信息傳遞(一)【fork函數(shù)、pipe函數(shù)、write/read操作、wait函數(shù)】 的區(qū)別不是特別大,只是具體介紹了 (一) 中沒有介紹到的知識(shí)點(diǎn)。
代碼實(shí)現(xiàn)
#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; }輸出結(jié)果:
運(yùn)行后每兩秒寫端會(huì)寫入數(shù)據(jù),然后讀端立即讀入數(shù)據(jù)。
標(biāo)準(zhǔn)流 和 標(biāo)準(zhǔn)流文件描述符
編程過程中我們常會(huì)用到 標(biāo)準(zhǔn)流 ,以 標(biāo)準(zhǔn)輸入流 為例:
- 標(biāo)準(zhǔn)輸入的文件描述子為 0
- POSIX <unistd.h> 定義是 STDIN_FILENO
- <stdio.h> 變量為 FILE* stdin ;
- <iostream> 變量為 std::cin
前兩者常被稱為 標(biāo)準(zhǔn)輸出文件描述符 ,而后兩者被稱為 標(biāo)準(zhǔn)輸出流 。
在 Linux 中,標(biāo)準(zhǔn)流,是 FILE* 類型,屬于系統(tǒng)的 I/O 設(shè)備,是標(biāo)準(zhǔn)I/O:
- 標(biāo)準(zhǔn)輸入 stdin
- 標(biāo)準(zhǔn)輸出 stdout
- 標(biāo)準(zhǔn)錯(cuò)誤 stderr
使用標(biāo)準(zhǔn)流的函數(shù)主要有:fread、fwrite、fclose 等,基本上都以 f 開頭。
標(biāo)準(zhǔn)流的文件描述符,是非負(fù)整數(shù)(int類型),屬于系統(tǒng) API 接口庫,是沒有 buffer 的 I/O ,直接調(diào)用系統(tǒng)調(diào)用,:
- 標(biāo)準(zhǔn)輸入文件描述符 STDIN_FILENO
- 標(biāo)準(zhǔn)輸出文件描述符 STDOUT_FILENO
- 標(biāo)準(zhǔn)錯(cuò)誤文件描述符 STDERR_FILENO
使用標(biāo)準(zhǔn)流的文件描述符的函數(shù)有:read、write、close 等。
代碼中用到的函數(shù)
fwrite()
fwrite 是 C 語言標(biāo)準(zhǔn)庫 中的一個(gè)文件處理函數(shù),功能是:向指定的文件中寫入若干數(shù)據(jù)塊,如成功執(zhí)行則返回實(shí)際寫入的數(shù)據(jù)塊數(shù)目。該函數(shù)以二進(jìn)制形式對(duì)文件進(jìn)行操作,不局限于文本文件。
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream)ptr —— 這是指向要被寫入的元素?cái)?shù)組的指針。
size —— 這是要被寫入的每個(gè)元素的大小,以字節(jié)為單位。
nmemb —— 這是元素的個(gè)數(shù),每個(gè)元素的大小為 size(第二個(gè)參數(shù)) 字節(jié)。
stream —— 這是指向 FILE 對(duì)象的指針,該 FILE 對(duì)象指定了一個(gè)輸出流。
perror()
perror 用來將上一個(gè)函數(shù)發(fā)生錯(cuò)誤的原因輸出到標(biāo)準(zhǔn)設(shè)備(stderr)。
void perror ( const char * str );參數(shù) str 所指的字符串會(huì)先打印出,后面再加上錯(cuò)誤原因字符串。此錯(cuò)誤原因依照全局變量 errno 的值來決定要輸出的字符串。
范例:
#include<stdio.h> int main(void) {FILE *fp;fp=fopen("/root/noexitfile","r+");if(NULL==fp){perror("/root/noexitfile");}return 0; }運(yùn)行結(jié)果:
[root@localhost io]# gcc perror.c [root@localhost io]# ./a.out /root/noexitfile: No such file or directory總結(jié)
以上是生活随笔為你收集整理的管道实现父子进程的信息传递(二)【标准流和其文件描述符、fwrite函数、perror函数】的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【赛码网】求数列的和
- 下一篇: 数组的转置和轴对称