文章目錄
- 代碼實現
- 標準流 和 標準流文件描述符
- 代碼中用到的函數
- 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