2015.1.27
星期二,早晨阴天,中午下雪了
今天上午老师不上课,
程序语句,记一下:
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()
{
char buf[MAXLINE];
pid_t pid;
int status;

printf("%% ");
while(fgets(buf,MAXLINE,stdin) != NULL) get返回的每一行都以换行符终止,后随一个null字符
}
else if(pid == 0)
{
{
if(buf[strlen(buf)-1] == '\n') get返回的每一行都以换行符终止,后随一个null字符
{
buf[strlen(buf)-1] = 0;
}

if((pid = fork()) < 0)
{
err_sys("fork error");
execlp(buf,buf,(char *)0); 从标准输入读入的命令,用新的程序文件替换子进程原先执行的文件
err_sys("couldn't execute:%s",buf);
exit(127);
}

if((pid = waitpid(pid, &status,0)) < 0) waitpid暂停当前进程的执行,知道有信号和子进程结束,0:阻塞父进程,等待子进程退出
err_sys("waitpid error");
}

printf("%% ");
}
exit(0);

}

调用getuid(),getgid()分别打印用户ID和组ID

main()
{
printf("uid = %d, gid = %d\n", getuid(), getgid());
exit(0);
}

signal 设置信号处理方式
void (*signal(int signum,void(*handler)(int)))(int)

函数依据signum指定的信号编号来设置该信号的处理函数,当指定的信号到达时就会跳转到参数handler指定的函数执行。
如果handler不是函数指针,则必须是下列两个常量之一:
SIG_IGN 忽略参数signum指定的信号
SIG_DRL 将参数signum指定的信号重设为核心预设的信号处理方式

日历时间:自1970年1月1日00:00:00以来国际标准时间所进过的秒数累计值,可用于记录文件最后一次修改的时间等

pathconf 的返回值是基于工作目录的的相对路径名的最大长度

int creat(const char *pathname,mode_t mode )

返回值:成功则返回为只写打开的文件描述符,若出错则返回-1

off_t lseek(int filedes,off_t offset, int whence)
返回值:成功则返回新的文件偏移量,出错:-1,具体偏移量根据whence参数设定!

因为偏移量可正可负,判断是否可以设置便宜量是应该测试是否等于-1,偏移量可以大于文件长度,这样下次写的时候
就会产生一个空的,这是允许的。具体在磁盘上的存储区间依据文件系统而定!

打开当前文件的偏移量:
off_t currpos
currpos = lseek(fd,0,SEEK_CUR);

od -c file (-c表示以字符方式打印文件内容)

ssize_t read(int filedes,void *buf,size_t nbytes)
返回值:成功则返回读到的字节数,若读到文件尾则返回0,出错:-1
当从终端设备读时,通常一次最多读一行

int dup (int filedes); == fcnt1(filedes ,F_EUPFD,0) (funt1改变已打开的文件的性质,返回值依据第二个参数变化)
int dup2(int filedes ,int filedes2) == fcnt1(filedes ,F_EUPFD,filedes2)
两个函数都是用来赋值一个现存文件描述符,成功返回新的文件描述符,出错:-1
dup2则可以用filedes2参数指定新的描述符的数值,如果filedes2已经打开,则先将其关闭,如果filedes2==filedes,则返回filedes2,不关闭
dup2是一个原子操作(由多步组成的操作)

为了保证磁盘上实际文件系统与缓冲区高速缓存中内容的一致性,unix系统提供了:sync,fsync,fdatasync
void sync(void)
int fsync(int filedes)
int fdatasync(int filedes) 只对数据有用

fchmod 是对已打开的文件进行操作

wc -c core // 8483248 core
du -s core // 272 core 所占磁盘空间总量,文件有空洞

int link(const char *existingpath,const char *newpath)
创建一个新目录项newpath,它引用现有的文件existingpath,成功返回0,出错:-1

int unlink(const char *pathname)
删除目录项,并将由pathname引用的文件的链接计数减一

main(void)
{
if(open("tempfile",O_RDWR) < 0)
err_sys("open error");
if(unlink("tempfile") < 0)
err_sys("unlink error");
printf("file unlinked\n");
sleep(15);
printf("done\n");
exit(0);

}

int remove(const char *pathname);
解除对一个文件或目录的链接;

int rename(const char *oldname,const char *newname);
文件或目录更改名字,成功返回0,出错:-1

int utime(const char *pathname,const struct utimbuf *time) 成功返回0,出错:-1

struct utimebuf{
time_t actime;
time_t modtime;
}
下面的程序是UNIX环境高级编程上的实例:
程序使用带O_TRUNC选项的open函数将文件长度截短为0,但并不改变其访问时间和修改时间:
先用stat函数得到这些时间,然后截短文件,最后用utime函数复位这两个时间;

#include "apue.h"
#include <fcn1.h>
#include <utime.h>

int main(int argc,char *argv[])
{
int i, fd;
struct stat statbuf;
struct utimbuf timebuf;
for(i = 1;i < argc; i++)
{
if(stat(stgv[i],&statbuf) < 0)
{
err_ret ("%s:stat error",atgv[i]);
continue;
}
if((fd = open(argv[i],O_RDWR | O_TRUNC)) < 0)
{
err_ret("%s:open error",srgv[i]);
continue;
}
close(fd);
timebuf.actime = statbuf.st_atime;
timebuf.modtime = statbuf.st_mtime;
if(utime(argv[i],&timebuf) < 0)
{
err_ret("%s:utime error",argv[i]);
continue;
}
}
exit(0);
}

int mkdir(const char *pathname,mode_t mode);
int rmdir(const char *pathname);

int chdir(const char *pathname); 更改当前目录
int fchdir(int filedes);
四个函数都是成功返回0,出错-1

char *getcwd(char *buf,size_t size); 取得当前的工作目录,成功返回buf,出错:NULL
先用调用getcwd函数把目录保存一下,完成处理后,将保存的路径作为参数传给chdir,这样就回到了系统文件的起点。

main()
{
char *ptr;
int size;
if(chdir("/usr/spool/uucppublic")<0)
{
err_sys("chdir failed");
}
ptr = path_alloc(&size);
if(getcwd(ptr,size) == NULL)
{
err_sys("getcwd failed");
}
printf("cwd = %s\n",ptr);
exit(0);
}

main()
{
if(chdir("/tmp") < 0)
err_sys("chdir failed");
printf("chdir to /tmp succeeded\n");
exit(0);
}

#define hello t = a;\
a = b;\
b = t;

今天看的UNIX环境高级编程就记到这里,看了前面四章,第五章是标准I/O库的函数,涉及到文件流,为了系统点,全部记在明天的日记里,
方便前后只是的连贯性!

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

UNIX,基础知识,文件IO,文件和目录的更多相关文章

  1. 《UNIX环境高级编程》(APUE) 笔记第一章 - UNIX基础知识

    1 - UNIX基础知识 Github 地址 1. 操作系统 可将操作系统定义为一种软件,它控制计算机硬件资源,提供程序运行环境.通常将这种软件称为 内核 (kernel) .( Linux 是 GN ...

  2. UNIX环境高级编程--第一章 UNIX基础知识

    第一章 UNIX基础知识 1.2 UNIX体系结构   从严格意义上说,可将操作系统定义为一种软件,它控制计算机硬件资源,提供程序运行环境.我们将这种软件称为内核(kernel),因为 它相对较小,且 ...

  3. 【Unity基础知识之三】Unity Assets目录下的特殊文件夹名称

    Unity3D的特殊目录名称   Unity预留了一些目录名称,这些目录有着特殊的含义.比较重要的有: Resources这个目录下的所有文件都会被打包到发布版本中,程序可以通过文件路径来访问它们.这 ...

  4. PHP面试 PHP基础知识 七(文件及目录处理)

    文件操作 文件打开函数 fopen()函数 //用来打开一个文件 打开时需要指定打开模式 语法:fopen( filename, mode, include_path, context); filen ...

  5. ASP.NET Core 2.2 基础知识(三) 静态文件

    什么是静态文件? HTML,CSS,JS,图片等都叫做静态文件. 要想提供静态文件给客户端,需要注册静态文件中间件. 我们先分别添加一个 WebAPI 项目,一个 Razor 视图项目,比较两个项目的 ...

  6. 《UNIX环境高级编程》笔记——1.UNIX基础知识

    这一章节侧重一些基本概念和书中用到的一些名词. 一.引言 所有的操作都提供服务,典型的服务包括:执行新程序.打开文件.读写文件.分配存储区以及获得当前时间等. 二.UNIX体系结构 其实linux常见 ...

  7. UNIX环境高级编程 第1章 UNIX基础知识

    所有操作系统都为运行在它之上的程序提供各种服务,典型的服务包括:执行新程序.打开文件.读写文件.分配存储空间.提供时间等. UNIX体系结构 严格来说,操作系统是一种软件,它控制计算机硬件资源,提供程 ...

  8. 第一章 UNIX 基础知识

    1.1 Unix体系结构 OS定义为一种软件,它控制计算机硬件资源,提供程序运行环境,一般称其为内核(kernel),它体积小,位于环境中心. 内核的接口为系统调用(system call),共用函数 ...

  9. UNIX读书笔记----UNIX基础知识

    UNIX体系结构: 从严格意义上讲,可将操作系统定义为一种软件,它控制计算机硬件资源,提供程序运行环境.我们通常将这种软件称为内核(Kernel),因为他相对较小,而且位于环境的核心.图片显示了UNI ...

  10. APUE(1)----UNIX基础知识

    一.UNIX体系结构 所有操作系统都为他们所运行的程序提供服务,典型的服务包括:执行新程序.打开文件.读文件.分配存储区等.严格意义上来说,操作系统可以定义为一种软件,它控制计算机硬件资源,提供程序运 ...

随机推荐

  1. JavaWeb基础:HTTP协议和基于Restful的架构

    HTTP介绍 HTTP协议是互联网上应用最广泛的协议,它是一种无状态的数据传输协议,规定了数据请求方和数据响应方的数据传输方式:使用HTTP协议可以跨平台,跨语言的进行数据传输和展示. 目前的Web应 ...

  2. php使用位与运算符【&】位或运算符【|】实现权限管理

    权限值是这样的2^0=1,相应2进数为”0001″(在这里^我表示成”次方”,即:2的0次方,下同)2^1=2,相应2进数为”0010″2^2=4,相应2进数为”0100″2^3=8,相应2进数为”1 ...

  3. 转 SQL Union和SQL Union All两者用法区别效率以及与order by 和 group by配合问题

    SQL Union和SQL Union All两者用法区别效率以及与order by 和 group by配合问题 SQL Union和SQL Union All用法 SQL UNION 操作符 UN ...

  4. 3.7 嵌入式SQL

    可以放入所有高级语言中去,如C 因为,SQL是过程性语句,需要高级语言的非过程性处理集合的分类处理 一.一般形式 所有的SQL语句都必须加前缀EXEC SQL SQL语句完成结束标志(:或END EX ...

  5. JVM优化之调整大内存分页(LargePage)

    转自:http://cjjwzs.iteye.com/blog/1059381 本文将从内存分页的原理,如何调整分页大小两节内容,向你阐述LargePage对JVM的性能有何提升作用,并在文末点明了大 ...

  6. 实现IEnumberable接口和IEnumberator

    class BookEnum : IEnumerator //实现foreach语句内部,并派生 { public Book[] _book; //实现数组 ;//设置“指针” public Book ...

  7. Java:标示符 基本数据类型

    标示符: 在程序中自定义的一些名称,例如:变量.类名.方法名…… 组成有数字0~9.大小写英文字母.“$”和下划线“_”组成,且不能由数字开头,以及不能使用java已使用和保留的关键字. Java中的 ...

  8. php 采集类snoopy http://www.jb51.net/article/27568.htm | cURL、file_get_contents、snoopy.class.php 优缺点

    Snoopy是一个php类,用来模拟浏览器的功能,可以获取网页内容,发送表单. Snoopy的特点: 1.抓取网页的内容 fetch 2.抓取网页的文本内容 (去除HTML标签) fetchtext ...

  9. 浏览器渲染原理--reflow

    Web页面运行在各种各样的浏览器当中,浏览器载入.渲染页面的速度直接影响着用户体验简单地说,页面渲染就是浏览器将html代码根据CSS定义的规则显示在浏览器窗口中的这个过程.先来大致了解一下浏览器都是 ...

  10. JavaScript 字符串和日期内容整理

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...