- 博客(102)
- 资源 (7)
- 收藏
- 关注
原创 C实现输入输出重定向
/* 实现"+"为输入重定向,"-"为输出重定向 */#include <stdio.h>#include <string.h>#include <stdlib.h>#include <unistd.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#define BUFF (1024)int my_copy(int f
2020-08-31 16:45:34 577
原创 文件描述符与文件指针之间的转换
#include <stdio.h>#include <string.h>#include <stdlib.h>#include <unistd.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#define BUFF (1024)int fd2file(const char * path){ FILE *fp =
2020-08-31 09:48:24 263
原创 C中字符类型数据测试
#include <stdio.h>int main(){ char ch = 'F'; ch = getchar(); int i,j; for(i = 0; i <= ch - 'A'; i ++) { for(j = 0; j < i ; j ++) putchar('_');#if 1 for(j = 0; j <= i; j ++) putchar(ch - j);#endif putchar(10); } retu
2020-08-27 13:50:25 136
原创 Linux下C中打印文件的属性信息
#include <stdio.h>#include <unistd.h>#include <time.h>#include <sys/types.h>#include <sys/stat.h>int main(int argc, char *argv[]){ struct stat buf; int n; struct tm *tp; if(argc < 2) { printf
2020-08-27 13:49:45 351
原创 exit与_exit函数的比较
_exit()执行后会立即返回,而exit()要先执行一些清除操作,比如刷新缓冲区,然后将控制权交给内核。调用_exit()函数时,会关闭进程所有的文件描述符,清理内存,以及其他一些内核清理函数,但不会刷新流(stdin 、stdout、stderr……)。exit()函数是在_exit()函数上的一个封装,它会调用_exit,并在调用之前先刷新流。exit()函数与_exit()函数最大的区别就在于,exit()函数在调用exit系统之前要检查文件的打开情况,把文件缓冲区的内容写回文件。代码测试#
2020-08-27 13:49:29 352
原创 C指针与指针之间的相减操作
指针与指针的相减操作,表示两个指针指向的内存位置之间相隔多少个元素(注意是元素,并不是字节数)。例如对于int类型的指针p和p1,p1-p的意义表示他们之间相隔多少个int类型的元素。同样对于其他类型的指针变量之间相减的意义也是一样。测试代码#include <stdio.h>int main(int argc,const char * argv[]){ int a[3] = {1,2,3}; int *p = a; printf("---------------
2020-08-27 13:49:15 5490
原创 Linux下C实现打印指定的目录下所有文件名称
#include <stdio.h>#include <dirent.h>int main(int argc, char *argv[]) {{ DIR *dirp; struct dirent *dp; if (argc < 2) { printf(“Usage : %s <directory>\n”, argv[0]); return -1; } if ((dirp = opend
2020-08-26 14:01:40 970
原创 文件IO中的目录操作
opendir函数#include <sys/types.h>#include <dirent.h>DIR *opendir(const char *name);功能:打开一个目录,获取目录流指针参数: name:目录名返回值: DIR是用来描述一个打开的目录文件的结构体类型,成功时返回目录流指针;出错时返回NULL。readdir函数#include <dirent.h>struct dirent *readdir(DIR *dirp);功能
2020-08-26 13:59:45 222
原创 文件IO基础总结
特点1、posix(可移植操作系统接口)定义的一组函数2、不提供缓冲机制,每次读写操作都引起系统调用3、核心概念是文件描述符4、访问各种类型文件5、Linux下, 标准IO基于文件IO实现一、open函数int open(const char *pathname, int flags);int open(const char *pathname, int flags, mode_t mode);功能:打开一个文件,获得文件的文件描述符参数: pathname:指定打开的文件路
2020-08-26 13:49:19 203
原创 Linux下C中使用write函数实现将键盘输入的内容写入文件,直到输入quit退出程序
#include <stdio.h>#include <fcntl.h>#include <unistd.h>#include <string.h>#define N 128int main(int argc, const char *argv[]){ int fd; char buf[N] = { 0 }; memset(buf, 0, sizeof(buf)); if ((fd = open
2020-08-26 13:45:49 2086
原创 Linux下使用C中read函数实现统计文件大小
#include <stdio.h>#include <fcntl.h>#include <unistd.h>#define N 128int main(int argc, const char *argv[]){ int fd = -1; int n = 0; int total = 0; char buf[N]; if(argc < 2) { printf("
2020-08-26 13:38:27 564
原创 fprintf sprintf函数使用示例
//fprintf sprintf函数使用示例//以指定格式 “年-月-日” 分别写入文件和缓冲区#include <stdio.h>#include <string.h>int main(int argc, char *argv[]){ int year = 2020; int month = 8; int day =26; FILE *fp; char buf[64]; if((fp = fopen("test
2020-08-26 10:56:44 281
原创 标准IO函数获取文件的大小
#include <stdio.h>int main(int argc, char *argv[]){ FILE *fp; long length = 0; if((fp = fopen("test.txt", "r")) == NULL) { perror("fopen"); return -1; } fseek(fp, 0, SEEK_END); length = ftell(fp); printf("
2020-08-26 10:47:02 861
原创 Linux下C实现统计文本文件含有多少行
#include <stdio.h>#include <string.h>#define N 64int main(int argc, char *argv[]){ FILE *fp; int line = 0; char buf[N]; if(argc < 2) { printf("Usage: %s <file>\n", argv[0]); return -1; } if(
2020-08-26 10:29:18 291
原创 strerror函数使用
通过标准错误的标号,获得错误的描述字符串 ,将单纯的错误标号转为字符串描述。#include <stdio.h>#include <string.h>#include <errno.h>int main(int argc, char *argv[]){ FILE *fp; if ((fp = fopen("test.txt", "r")) == NULL) { printf("errno=%d\n",errno);
2020-08-26 10:03:57 1011
原创 freopen函数使用
freopen是被包含于C标准库头文件<stdio.h>中的一个函数,用于重定向输入输出流。该函数可以在不改变代码原貌的情况下改变输入输出环境,但使用时应当保证流是可靠的。FILE *freopen( const char *filename, const char *mode, FILE *stream );功能:以指定模式重新指定到另一个文件。模式用于指定新文件的访问方式。形参:filename:需要重定向到的文件名或文件路径。mode:文件访问权限。stream:需要被重定向的
2020-08-26 09:58:29 1370
原创 字符编码方式对ELF显示的影响
Linux默认使用的是UTF-8格式文件,所以有时候将Linux下编辑保存后的文件在Windows下查看会发现有乱码。在一些对编码格式有要求的场合,一定要注意使用正确的编码方式,比如字符叠加等场合,这个坑我是真的踩过的。使用UTF-8格式编码的源码文件,默认保存为UTF-8格式使用gcc编译,默认保存的格式为UTF-8。#include <stdio.h>int main(int argc, const char *argv[]){ int i = 0; unsigned c
2020-08-25 08:51:58 443
原创 C实现测试距今年的闰年数目
#include <stdio.h>int main(int argc, const char* argv[]){ int i = 0; int year = 0; int count = 0; for(year = 1; year <= 2020; year ++) { if(((!(year % 4)) && (year % 100)) || (!(year % 400))) { printf("%6d", year)
2020-08-21 14:56:06 106
原创 使用线程的互斥锁实现生产者消费者模型
#include <pthread.h>#include <stdio.h>#include <stdlib.h>#include <string.h>#include <sys/types.h>#include <unistd.h>#include <sys/syscall.h>#define PTHREAD_NUM 2typedef void *(*pthread_func_t)(void *);
2020-08-20 13:38:59 198
原创 使用互斥锁实现字符串的逆置
#include <pthread.h>#include <stdio.h>#include <stdlib.h>#include <string.h>#include <sys/syscall.h>#include <unistd.h>typedef void *(*pthread_func_t) (void *);pthread_mutex_t mutex;char buf[] = "hello world";
2020-08-20 13:17:15 211
原创 互斥锁与条件变量实现按照顺序打印ABC
#include <stdio.h>#include <unistd.h>#include <pthread.h>#include <semaphore.h>#define PTHREAD_NUM 3void *print_a(void *);void *print_b(void *);void *print_c(void *);typedef void *(*pthread_func_t)(void *);struct abc_de
2020-08-20 12:06:09 328
原创 使用三个线程下的信号量实现顺序打印ABC
#include <stdio.h>#include <unistd.h>#include <pthread.h>#include <semaphore.h>#define PTHREAD_NUM 3void * print_a(void *);void * print_b(void *);void * print_c(void *);typedef void *(*pthread_func_t)(void *);typedef st
2020-08-20 10:53:29 463
原创 父子进程各拷贝一半文件实现
#include <stdio.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <stdlib.h>#include <unistd.h>#define N 128char buf[N] = { 0 };int main(int argc, char const *argv[]){ pid_t pid; int r
2020-08-20 09:47:47 692
原创 面试题目
1.static 有什么用途?(请至少说明两种)2.全局变量和局部变量在内存中是否有区别?如果有,是什么区别?3.写出 float x 与“零值”比较的 if 语句。4. Windows 32 位系统下, C++程序,请计算 sizeof 的值char str[] = “http://www.uv-teck.com/”char *p = str ;int n = 10;请计算sizeof (str ) = ?sizeof ( p ) = ?sizeof ( n ) = ?void *p
2020-08-20 09:11:03 132
原创 Shell处理文件
待处理的文件(忽略第一行)日期 开盘 收盘 涨跌 涨跌幅20080102 5,265.00 5,272.81 11.25 0.210%20080103 5,269.80 5,319.86 47.05 0.892%20080104 5,328.41 5,361.57 41.71 0.784%20080107 5,357.45 5,393.34 31.77 0.5
2020-08-20 08:42:38 121
原创 Linux网络编程
========================== 基础知识 =============授课过程中名词的规范:计算机处理的数据: 数据包物理网卡处理的数据: 数据帧IP地址:网间通信协议地址,用来在网络通信中唯一标识一台主机。IP地址目前有两类, IPv4、IPv6,目前主流是IPv4,未来的趋势是IPv6。IPV4地址是32bit的整数,IPv6地址是128bit的整数。IP地址的表示:二进制整数: 11000000 10101000 00000001 00000001点分十进制:
2020-08-20 08:42:01 218
原创 IO超级总结
文件:一组数据的集合。文件名:集合的名称。Linux系统下的7种文件类型:b block 块设备文件c character 字符设备文件d directory 目录文件- 普通文件l link 链接文件s socket 套接字文件p pipe 管道文件IO: 输入/输出。输入: 数据由外部流向进程内部。例如读键盘、读磁盘、接受网络数据等。输出: 数据由进程内部流向外部。例如向屏幕打印、写入磁盘、发送网络数据等。标准IO: 是由C标准库提供的函数接口, 有缓存,是高级I
2020-08-19 22:03:55 155
原创 C语言高级
gcc的编译过程1.预处理: 展开头文件、宏替换等,处理一切预处理指令(凡是以#号开头的语句) 头文件的作用:声明了函数原型(以便于编译器检测传参)、声明了外部全局变量、定义了数据结构和宏等。2.编译: 进行语法、语义、词法分析,最终把C语言程序编译成汇编语言程序。3.汇编: 进行语法、语义、词法分析,最终把汇编语言程序汇编成机器码。4.链接: 将程序的段内偏移地址重定位为线性地址,根据符号表链接静态运行库或目标文件。二进制代码工具objdump: 反汇编、查看二进制代码
2020-08-19 21:59:33 305
原创 C超级总结
=========== C语言源文件的组成 ===================预处理指令:凡是以‘#’开头的行,都属于预处理指令。include define ifndef endif 等例如:#include <stdio.h>#define N 10定义语句:结构体类型定义、别名定义、全局变量定义等。例如:struct student { int id; int score;};typedef int int32;int value = 10;声明
2020-08-19 21:56:41 357
原创 Linux下C内存对齐规则
内存对齐规则内存对齐有三种单位: 字、半字、字节。宽度为4B的数据要存放在能够被4整除的地址上。 (例如32位系统中的int、long)宽度为2B的数据要存放在能够被2整除的地址上。 (例如32位系统中的short)宽度为1B的数据要存放在能够被1整除的地址上(任意存放)。 (例如char)结构体的整体大小是其中最大基本类型的整数倍(如果基本类型的大小超过了系统的字长,则按系统字长计算。例如double)。GCC提供了一些机制允许用户自己控制内存对齐方式:一、使用编译注解机制 pra
2020-08-19 21:49:21 582
原创 Linux下软件管理
离线安装安装: sudo dpkg -i 安装包文件名卸载: sudo dpkg -r 软件包名查看软件状态: dpkg -s 软件包名查看软件安装路径: dpkg -L 软件包名查看软件包内容: dpkg -c 安装包文件名APT高级软件包管理工具集1.安装: sudo apt-get install 软件包名2.卸载: sudo apt-get remove 软件包名3.查看软件基本信息: apt-cache show 软件包名4.更新本地软件包索引表:
2020-08-19 16:21:10 117
原创 静态库与动态库的比较
1、静态库在编译的时候被加载,动态库在执行的时候被加载。2、加载静态库编译所生成的可执行文件比使用动态库的方式要大。3、静态库以.a为后缀,动态库以.so为后缀。静态库的制作:1.通过gcc -c add.c 生成目标文件 =》add.o2.通过ar crs -o libadd.a add.o 生成静态库 =》libadd.a3.通过gcc main.c -L. -ladd 链接静态库编译,生成可执行文件a.out4.执行a.out即可动态库的制作:1.通过gcc -c add.c 生成
2020-08-19 14:24:19 557
原创 Linux下进程间通信
同一个进程中的线程间由于共享内存地址空间,因此可以使用全局变量或者开放地址的堆空间直接通信, 不需要额外的开销。但是进程间由于各自空间地址独立,导致不可能直接通信,因此需要使用额外的开销——进程间通信机制。LINUX 进程间通信方式:UNIX: /* 传统, 绝大多数类UNIX系统都支持 */ 有名管道:mkfifo write read close 无名管道:pipe write read close 信号: signal kill raise pause alarm POSIX:
2020-08-19 13:40:00 167
原创 Linux下线程相关概念
UNIX/Linux的标准分类:BSDSystem VPOSIXpthread是遵循POSIX标准的thread。线程是轻量级的进程。进程是任务资源分配的基本单元。线程是任务时间调度的基本单元。回调函数创建线程int pthread_create(pthread_t *tid, pthread_attr_t *attru, void*(*callback)(void *), void *arg);功能: 创建一个线程,并让新的线程去实行callback函数。返回值: 成功, 0;
2020-08-19 13:36:31 111
原创 Linux下进程相关函数接口
创建进程pid_t fork(void);功能: 创建一个子进程。参数: 无。返回值: 成功:在父进程空间返回子进程的PID,在子进程空间返回0; 失败: -1,没有子进程被创建。结束进程void exit(int status);功能: 结束当前进程。返回值:无,一旦调用永不返回。参数: int status, 用户期望带回的状态值,一般表示任务是否成功。void _exit(int status) 同exit, 区别是_exit函数立即结束进程,不清理缓存。获取进程状态
2020-08-19 13:30:29 269
原创 Linux下进程基础
程序:由数据和指令组成,是静态的,一般存在于磁盘中,当装载进内存后可被执行。进程:是正在执行的程序,是动态的,在计算机内存中,包括程序的指令、数据以及程序运行需要的栈、堆、打开的文件等一切资源。进程的状态:运行态、可中断睡眠态、不可中断睡眠态、停止态、僵尸态、死亡态。进程的数据空间:常量区、静态区、堆区、栈区。Linux采用虚拟内存机制来管理系统内存,每个进程的地址空间都是虚拟的,通过内存映射表对应物理内存。段错误是操作系统的一种保护机制,当进程遇到了不可恢复的访存错误时,内核发出信号将该
2020-08-19 13:25:40 94
原创 文件IO接口函数
open( )#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>int open(const char *pathname, int flags);int open(const char *pathname, int flags, mode_t mode);功能:创建或者打开文件,得到文件描述符参数:pathname:文件名flags:文件的访问权限O_RDONLY 只读O_W
2020-08-18 08:57:13 293
原创 进程基础1
进程进程是一个独立的可调度的任务 进程是一个动态的概念,它是程序执行的过程,包括创建、调度和消亡创建:程序在执行的时候,内核将程序代码载入到虚拟地址空间(4G,映射物理内存,0~3G属于用户空间,3~4G内核空间),为程序数据变量分配空间,建立记账数据结构(task struct),保存进程的属性信息(PID,进程的状态)调度:进程管理单元,上下文切换消亡:内存的释放虚拟的地址空间:内存规划:将虚拟地址空间分割成大小为4K的页单元,同时将RAM分割成相同尺寸的页帧对于进程而言,虚拟地址空间中
2020-08-18 08:56:48 81
原创 int类型转换成字符串类型
#include <stdio.h>#define BUFF_SIZE 1024int int2string(int value, char *buff);int main(int argc, const char *argv[]){ int value = -98765432; char buff[BUFF_SIZE]; int2string(value, buff); puts(buff); return 0;}int int2string(int val
2020-08-18 08:56:37 1466
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人