标准IO的简单应用,动静态库,读取系统时间并打印,模拟ls -l功能

2015.2.27
星期五,小雨

标准IO实现的复制功能:

#include <stdio.h>
#include <errno.h>

#define N 64

int main(int argc, char *argv[])
{
int n;
char buf[N];
FILE *fps, *fpd;

if(argc < 3)
{
printf("usage : %s <src_file><dst_file>\n",argv[0]);
return -1;
}

if((fps = fopen(argv[1],"r")) == NULL)
{
fprintf(stderr,"fail to fopen %s : %s\n",argv[1],strerror(errno));
return -1;
}

if((fpd = fopen(argv[2],"w")) == NULL)
{
fprintf(stderr,"fail to fopen %s : %s\n",argv[2],strerror(errno));
fclose(fps);
return -1;
}

while((n = fread(buf, 1, N, fps)) > 0)
{
fwrite(buf, 1, n, fpd);
}

fclose(fps);
fclose(fpd);
return 0;

}

fgets()/fputs()/get()/putc()调用的代码:

int main(void)
{
int c;
while((c = getc(stdin)) != EOF)
{
if(putc(c, stdout) == EOF)
{
err_sys("output error");
}
}
if(ferror(stdin))
{
err_sys("input error");
}
exit(0);
}

对比上下两个程序:

int main(void)
{
char buf[MAXLINE];
while((c = fgets(buf, MAXLINE, stdin)) != NULL)
{
if(fputs(buf, stdout) == EOF)
{
err_sys("output error");
}
}
if(ferror(stdin))
{
err_sys("input error");
}
exit(0);
}
硬链接:ln 可删除,删除链接只会减少链接数,大小表示链接里面的内容的大小
软链接:又称符号链接:ln -s ,删除链接的对象将不能访问之前的内容,大小表示链接对象符号自身的大小,不是里面内同的大小

[email protected]:~/file/link$ ls -l
total 0
-rw-r--r-- 1 lg lg 0 2015-02-27 14:13 hello
[email protected]:~/file/link$ echo 123 > hello
[email protected]:~/file/link$ cat hello
123
[email protected]:~/file/link$ ls -l
total 4
-rw-r--r-- 1 lg lg 4 2015-02-27 14:14 hello
[email protected]:~/file/link$ ln hello hardlink
[email protected]:~/file/link$ ls -l
total 8
-rw-r--r-- 2 lg lg 4 2015-02-27 14:14 hardlink 链接数变成了2
-rw-r--r-- 2 lg lg 4 2015-02-27 14:14 hello
[email protected]:~/file/link$ ln -s hello slink
[email protected]:~/file/link$ ls -l
total 8
-rw-r--r-- 2 lg lg 4 2015-02-27 14:14 hardlink
-rw-r--r-- 2 lg lg 4 2015-02-27 14:14 hello
lrwxrwxrwx 1 lg lg 5 2015-02-27 14:15 slink -> hello //这里的5表示slink的字符个数,软链接不增加链接数
[email protected]:~/file/link$ cat hardlink //显示硬链接内容
123
[email protected]:~/file/link$ cat slink //显示软链接内容
123
[email protected]:~/file/link$ rm hello //删除原链接后再次查看软硬两种链接效果
[email protected]:~/file/link$ cat hardlink //硬链接可显示,因为磁盘内容没删除,只有链接数变成0才会删除磁盘内容
123
[email protected]:~/file/link$ cat slink //软链接无法显示之前的内容,此时磁盘内容已删除
cat: slink: No such file or directory
[email protected]:~/file/link$

静态库和动态库的不同点在于代码被载入的时刻不同:

静态库在程序编译的时候会被链接到目标代码中,程序运行时不再需要该静态库,因此体积较大。
动态库在程序编译时并不会链接到目标代码中,而是在程序运行的时候才被载入,因此程序运行时还需要动态库的存在,代码体积较小。

静态库:
gcc -c xx.c 生成多个xx.o文件
ar -crsv libpr.a pr1.o pr2.o 静态库打包完成
gcc main.c -lpr -L. (最后的-L.是表示在当前路径下查找库) 链接刚才创建的静态库,别人没有源文件,只有编译好的库

共享库的生成:
main.c Makefile pr1.c pr2.c
gcc -c pr1.c pr2.c -fPIC(创建于位置无关的编译程序)
gcc -o libpr.so -shared pr1.o pr2.o //共享库创建完成
gcc main.c -lpr -L.

没隔1秒读取一次系统时间并写入文件:

#include <stdio.h>
#include <time.h>
#include <unistd.h>

#define N 64

int main(int argc, char *argv[])
{
FILE *fp;
time_t t;

if(argc < 2)
{
printf(" usage : %s <file>\n",argv[0]);
return -1;
}

if((fp = fopen(argv[1],"w")) == NULL)
{
perror("fail to open");
return -1;
}

while(1)
{
time(&t);
fprintf(fp,"%s\n",ctime(&t));
//fwrite(ctime(&t),1,24,fp); //用fwrite实现相同的效果
//fprintf(fp,"\n");
fflush(fp); //需要加强制刷新
sleep(1);
}

fclose(fp);

return 0;
}

程序运行效果:
[email protected]:/mnt/hgfs/source test/file IO$ gcc mytime.c
[email protected]:/mnt/hgfs/source test/file IO$ ./a.out time
^C
[email protected]:/mnt/hgfs/source test/file IO$ cat time
Fri Feb 27 20:09:36 2015

Fri Feb 27 20:09:37 2015

Fri Feb 27 20:09:38 2015

[email protected]:/mnt/hgfs/source test/file IO$

模拟ls -l的功能:

#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <pwd.h>
#include <grp.h>
#include <time.h>

#define MAXLEN_SYMBLINK 64
#define TEST_TYPE 2

int main(int argc, char *argv[])
{
struct stat buf;
char out[MAXLEN_SYMBLINK + 1];
struct tm *t;
ssize_t n;

if(argc != 2)
{
fprintf(stderr,"Usage: %s <pathname>\n",argv[0]);
return 0;
}

if(lstat(argv[1],&buf) < 0)
{
perror("lstat error");
return -1;
}

switch(buf.st_mode & S_IFMT)
{
case S_IFREG:
default: printf("-");break;
case S_IFDIR: printf("d"); break;
case S_IFCHR: printf("c"); break;
case S_IFBLK: printf("b"); break;
case S_IFIFO: printf("p"); break;
case S_IFLNK: printf("l"); break;
case S_IFSOCK: printf("s"); break;

}

if(S_IRUSR & buf.st_mode) printf("r");
else printf("-");

if(S_IWUSR & buf.st_mode) printf("w");
else printf("-");

if(S_IXUSR & buf.st_mode) printf("x");
else printf("-");

if(S_IRGRP & buf.st_mode) printf("r");
else printf("-");

if(S_IWGRP & buf.st_mode) printf("w");
else printf("-");

if(S_IXGRP & buf.st_mode) printf("x");
else printf("-");

if(S_IROTH & buf.st_mode) printf("r");
else printf("-");

if(S_IWOTH & buf.st_mode) printf("w");
else printf("-");

if(S_IXOTH & buf.st_mode) printf("x");
else printf("-");

printf(" %d",buf.st_nlink);

struct passwd *pw;
pw = getpwuid(buf.st_uid);
printf(" %s",pw->pw_name);

struct group *gr;
gr = getgrgid(buf.st_gid);
printf(" %s",gr->gr_name);

printf(" %4ld",buf.st_size);

t = localtime(&buf.st_mtime);
printf(" %04d-%02d-%02d %02d:%02d",
t->tm_year + 1900,
t->tm_mon + 1,
t->tm_mday,
t->tm_hour,
t->tm_min);

printf(" %s ",argv[1]);

if(S_ISLNK(buf.st_mode))
{
printf(" -> ");
if(-1 == (n = readlink(argv[1], out, MAXLEN_SYMBLINK)))
{
perror("readlink error");
}
else
{
out[n] = 0x00;
printf("%s",out);
}
}

printf("\n");

return 0;
}

程序运行效果:
[email protected]:/mnt/hgfs/source test/file IO$ ls -l time
-rwxrwxrwx 1 root root 78 2015-02-27 20:09 time
[email protected]:/mnt/hgfs/source test/file IO$ ./a.out time
-rwxrwxrwx 1 root root 78 2015-02-27 20:09 time
[email protected]:/mnt/hgfs/source test/file IO$

***************************************************************************************************************************************************************
***************************************************************************************************************************************************************
***************************************************************************************************************************************************************
***************************************************************************************************************************************************************

时间: 2024-12-14 18:53:43

标准IO的简单应用,动静态库,读取系统时间并打印,模拟ls -l功能的相关文章

Linux编译过程与动静态库制作

一.Linux编译过程 预处理->编译->汇编->链接 二.预处理 作用: 宏展开 头文件包含 条件编译 布局控制,如#pragma:添加行号,方便后期问题查错. 编译命令 gcc -E  *.c  -o  *.i 三.编译 作用: 将预处理生成的代码进行词法.语法与语义进行解析,生成汇编代码. 命令: gcc -S *.i -o *.s 四.汇编 作用: 将汇编代码进行处理,转换成计算机能识别指令集,生成目标文件(.o/.obj). 命令: gcc -c *.s -o *o 五.链接

gcc总结【基本用法】【选项】【动静态库】(转)

1.//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// linux下c编程起步一:掌握gcc基本用法 初学时最好从命令行入手,

linux动静态库使用

#include<stdio.h> #include "cac.h" int main(void) { printf("add = %d\n" ,add(5,3)); printf("sub = %d\n" ,sub(5,3)); return 0; } int add(int a,int b) { return a+b; } int sub(int a,int b) { return a-b; } int add(int a,int

动态库与静态库优缺点比较

动态库与静态库优缺点比较 (2012-10-18 15:31)      我们在编写一个C语言程序的时候,经常会遇到好多重复或常用的部分,如果每次都重新编写固然是可以的,不过那样会大大降低工作效率,并且影响代码的可读性,更不利于后期的代码维护.我们可以把他们制作成相应的功能函数,使用时直接调用就会很方便,还可以进行后期的功能升级.  例如我要在一段代码中多次交换两个变量的值,我可以在代码中多次写入 i=x;x=y;y=i; 不过这样未免有点麻烦我们可以编写一个change_two_int()函数

C/C++的静态库与动态库

C/C++编程中相关文件后缀(以Linux系统下为例): .a:           静态库(archive) .c/.cpp:  C/C++源程序 .h/.hpp: C/C++源程序的头文件 .i:           经过预处理后的C/C++源程序 .o:        对象文件 .s:        汇编语言代码 .so:      动态链接库 本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存运行.库有两种:静态库(Linux操作系统下是以.a做后缀,Windows操作系统

浅析静态库链接原理

静态库的链接基本上同链接目标文件.obj/.o相同,但也有些不同的地方.本文简要描述linux下静态库在链接过程中的一些细节. 静态库文件格式 静态库远远不同于动态库,不涉及到符号重定位之类的问题.静态库本质上只是将一堆目标文件进行打包而已.静态库没有标准,不同的linux下都会有些细微的差别.大致的格式wiki上描述的较清楚: Global header ----------------- +------------------------------- File header 1 --->

C++静态库与动态库(比较透彻)

这次分享的宗旨是——让大家学会创建与使用静态库.动态库,知道静态库与动态库的区别,知道使用的时候如何选择.这里不深入介绍静态库.动态库的底层格式,内存布局等,有兴趣的同学,推荐一本书<程序员的自我修养——链接.装载与库>. 什么是库 库是写好的现有的,成熟的,可以复用的代码.现实中每个程序都要依赖很多基础的底层库,不可能每个人的代码都从零开始,因此库的存在意义非同寻常. 本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行.库有两种:静态库(.a..lib)和动态库(.so..

c/c++:动态库 静态库 linux/windows 例子 (转)

作者:吴秦出处:http://www.cnblogs.com/skynet/本文基于署名 2.5 中国大陆许可协议发布,欢迎转载,演绎或用于商业目的,但是必须保留本文的署名吴秦(包含链接). C++静态库与动态库 这次分享的宗旨是——让大家学会创建与使用静态库.动态库,知道静态库与动态库的区别,知道使用的时候如何选择.这里不深入介绍静态库.动态库的底层格式,内存布局等,有兴趣的同学,推荐一本书<程序员的自我修养——链接.装载与库>. 什么是库 库是写好的现有的,成熟的,可以复用的代码.现实中每

【转】IOS制作静态库

原文参见:http://blog.csdn.net/pjk1129/article/details/7255163 本身IOS的开发,只允许静态库或者Framework.在Xcode上没有找到允许编译,如同Android上的*.so和Win32上的dll这样的说法.不过Framework这样的框架,估计也是类似动态库的实现,不过没有具体研究过,后续继续深入研究. 我这个文档的静态库的开发是基于Xcode4.2和iOS SDK5.0编写的.Xcode4跟之前的Xcode3还是有不少的差别的. 下面