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 ,删除链接的对象将不能访问之前的内容,大小表示链接对象符号自身的大小,不是里面内同的大小

lg@lg-desktop:~/file/link$ ls -l
total 0
-rw-r--r-- 1 lg lg 0 2015-02-27 14:13 hello
lg@lg-desktop:~/file/link$ echo 123 > hello
lg@lg-desktop:~/file/link$ cat hello
123
lg@lg-desktop:~/file/link$ ls -l
total 4
-rw-r--r-- 1 lg lg 4 2015-02-27 14:14 hello
lg@lg-desktop:~/file/link$ ln hello hardlink
lg@lg-desktop:~/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
lg@lg-desktop:~/file/link$ ln -s hello slink
lg@lg-desktop:~/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的字符个数,软链接不增加链接数
lg@lg-desktop:~/file/link$ cat hardlink //显示硬链接内容
123
lg@lg-desktop:~/file/link$ cat slink //显示软链接内容
123
lg@lg-desktop:~/file/link$ rm hello //删除原链接后再次查看软硬两种链接效果
lg@lg-desktop:~/file/link$ cat hardlink //硬链接可显示,因为磁盘内容没删除,只有链接数变成0才会删除磁盘内容
123
lg@lg-desktop:~/file/link$ cat slink //软链接无法显示之前的内容,此时磁盘内容已删除
cat: slink: No such file or directory
lg@lg-desktop:~/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;
}

程序运行效果:
lg@lg-desktop:/mnt/hgfs/source test/file IO$ gcc mytime.c
lg@lg-desktop:/mnt/hgfs/source test/file IO$ ./a.out time
^C
lg@lg-desktop:/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

lg@lg-desktop:/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;
}

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

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

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

  1. gcc使用及动静态库制作

    一. GCC的使用 1. GCC的编译过程 (1)预处理(cpp)gcc -E(输出问价通常以 .i 结尾),将头文件展开,宏替换等操作: (2)编译器(gcc)gcc -S(输出问价以 .s 结尾) ...

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

    1.////////////////////////////////////////////////////////////////////////////////////////////////// ...

  3. Linux动静态库

    gcc编译过程 预处理,gcc -E,.c->.i 展开宏和头文件,替换条件编译,删除注释.空白和空行 编译, gcc -S,.i -> .s 检查语法规范 [消耗时间和系统资源最多] 汇 ...

  4. xcode编写c/c++静态库使用系统头文件问题

    c/c++编写的静态库中有引用ios系统头文件比如: #include <EGL/egl.h> 在xcode编译的时候需要设置静态库程序: Build Settings-Header Se ...

  5. linux系统编程之文件与IO(六):实现ls -l功能

    本文利用以下系统调用实现ls -l命令的功能: 1,lstat:获得文件状态, 2,getpwuid: #include <pwd.h> struct passwd *getpwuid(u ...

  6. iOS 静态库,动态库与 Framework 浅析

    静态库与动态库的区别 首先来看什么是库,库(Library)说白了就是一段编译好的二进制代码,加上头文件就可以供别人使用. 什么时候我们会用到库呢?一种情况是某些代码需要给别人使用,但是我们不希望别人 ...

  7. (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO

    . . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...

  8. linux下的静态库和共享库

    转载&&增加:      我们在编写一个C语言程序的时候,经常会遇到好多重复或常用的部分,如果每次都重新编写固然是可以的,不过那样会大大降低工作效率,并且影响代码的可读性,更不利于后期 ...

  9. C++ 系列:静态库与动态库

    转载自http://www.cnblogs.com/skynet/p/3372855.html 这次分享的宗旨是——让大家学会创建与使用静态库.动态库,知道静态库与动态库的区别,知道使用的时候如何选择 ...

随机推荐

  1. UDP:用户数据报协议

    UDP是一个简单的面向数据报的运输层协议:进程的每个输出操作都正好产生一个UDP数据报,并组装成一份待发送的IP数据报.这与面向流字符的协议不同,如TCP,应用程序产生的全体数据与真正发送的单个IP数 ...

  2. UI设计的分类

    软件UI设计(界面设计包括硬件界面设计和软件界面设计,我们这里探讨的是软件界面设计)包括用户研究.交互设计.与界面设计三部分.   1,用户研究 我们再产品开发的前期,通过调查研究,了解用户的工作性质 ...

  3. C#定时执行一个操作

    一个客户端向服务器端socket发送报文,但是服务器端限制了发送频率,假如10秒内只能发送1次,这时客户端也要相应的做限制,初步的想法是在配置文件中保存上次最后发送的时间,当前发送时和这个上次最后时间 ...

  4. Matlab 霍夫变换 ( Hough Transform) 直线检测

    PS:好久没更新,因为期末到了,拼命复习中.复习久了觉得枯燥,玩玩儿霍夫变换直线检测 霍夫变换的基本原理不难,即便是初中生也很容易理解(至少在直线检测上是这样子的). 霍夫变换直线检测的基本原理:(不 ...

  5. Web1.0、Web2.0、Web3.0的主要区别

    Web1.0:以静态.单向阅读为主,网站内信息可以直接和其他网站信息进行交互,能通过第三方信息平台同时对多家网站信息进行整合使用. Web2.0:以分享为特征的实时网络,用户在互联网上拥有自己的数据, ...

  6. 如何myEclipse修改工程项目的运行环境和编译环境

    修改工程运行环境(开发环境)JRE 右击工程名-----选择properties----选择对话框左侧的java build path----查看使用的JRE 选择Library选项卡中的,选中使用中 ...

  7. linux笔记:用户和用户组管理-用户管理命令

    useradd(添加用户.在使用useradd添加一个用户后,必须使用passwd给该用户设置密码,该用户才能登陆): passwd(设置或修改用户密码): usermod(修改用户信息): chag ...

  8. sentinel搭建redis集群经验总结

    一.protected-mode默认情况下,redis node和sentinel的protected-mode都是yes,在搭建集群时,若想从远程连接redis集群,需要将redis node和se ...

  9. 【转】CentOS 6.5安装pyspider过程记录

    原文地址:http://blog.sina.com.cn/s/blog_48c95a190102wczx.html 1.根据pyspider官方推荐的安装方法,使用pip命令直接安装pyspider ...

  10. ReadOnly关键字修饰的变量可以修改,只是不能重新分配

    MSDN 官方的解释 readonly 关键字是可以在字段上使用的修饰符.当字段声明包括 readonly 修饰符时,该声明引入的字段赋值只能作为声明的一部分出现,或者出现在同一类的构造函数中.   ...