环境
linux环境
(WSL/Ubuntu22.04)
关键函数
linux下 C语言相关的库函数都可以通过在命令行上输入man + 函数名获得相关资料
另外man + 命令名字 也可以获得该命令的相关资料
read
keyword:nonblock/file descriptor
该函数是非阻塞性的 假设设置参数 调用函数 想要读取10个字符 如果目标缓冲区只有9个 就读取9个立马返回
参数中需要给定文件描述符
对于标准输入/标准输出的文件描述符是数值0/1
如果读取到EOF,立马返回
正常情况下返回读取到的字符数量
fread
keyword:block/FILE*
该函数是阻塞性的 假设设置参数调用函数 想要读取10个字符 如果目标缓冲区只有9个 函数不会立马返回 而是等待10个字符存在
参数中需要给定FILE*指针
对于标准输入/标准输出的文件描述符是stdin/stdout
如果读取到EO立马返回
正常情况下返回读取到的字符数量
关键命令行输入
enter/换车换行键
该输入同时有三个作用
- 将shell文本显示换行
- 将shell上的输入的该行字符串输入到标准输入的缓冲区
- 在标准输入的缓冲区末尾插入换车换行符(ASCII码:'\n')
ctrl + d组合键输入
该组合键的一个作用是:当shell某行输入了字符但是还没有输入回车换行 这时候输入该组合键 会将该行字符输入到标准输入的缓冲区
该组合键的另一个作用是:当shell中所有字符都输入到标准输入的缓冲区 这时候输入该组合键 会在标准输入的缓冲区放入一个EOF
关键函数和关键命令行输入 使用和测试
测试代码
#include <stdio.h>
#include <sys/select.h>
#include <unistd.h>
#include <string.h>
void func()
{
char a[10];
memset(a, 0, sizeof(a));
int nums = 0;
while((nums = fread(a, 1, sizeof(a), stdin)) == sizeof(a))
{
printf("nums:%d\n", nums);
fwrite(a, 1, nums, stdout);
}
fwrite(a, 1, nums, stdout);
return;
}
void func2()
{
char a[10];
memset(a, 0, sizeof(a));
int nums = 0;
while((nums = read(0, a, sizeof(a))) != 0)
{
printf("nums:%d\n", nums);
write(1, a, nums);
}
write(1, a, nums);
return;
}
int main()
{
func2();
printf("next test\n");
func();
printf("end");
return 0;
}
测试输入输出
根据测试的输入输出应该能完全验证关键函数和关键命令行输入的作用无误