文章目录
- 代码实现
- 标准流 和 标准流文件描述符
- 代码中用到的函数
- 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