UNIX,基础知识,文件IO,文件和目录
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,文件和目录的更多相关文章
- 《UNIX环境高级编程》(APUE) 笔记第一章 - UNIX基础知识
1 - UNIX基础知识 Github 地址 1. 操作系统 可将操作系统定义为一种软件,它控制计算机硬件资源,提供程序运行环境.通常将这种软件称为 内核 (kernel) .( Linux 是 GN ...
- UNIX环境高级编程--第一章 UNIX基础知识
第一章 UNIX基础知识 1.2 UNIX体系结构 从严格意义上说,可将操作系统定义为一种软件,它控制计算机硬件资源,提供程序运行环境.我们将这种软件称为内核(kernel),因为 它相对较小,且 ...
- 【Unity基础知识之三】Unity Assets目录下的特殊文件夹名称
Unity3D的特殊目录名称 Unity预留了一些目录名称,这些目录有着特殊的含义.比较重要的有: Resources这个目录下的所有文件都会被打包到发布版本中,程序可以通过文件路径来访问它们.这 ...
- PHP面试 PHP基础知识 七(文件及目录处理)
文件操作 文件打开函数 fopen()函数 //用来打开一个文件 打开时需要指定打开模式 语法:fopen( filename, mode, include_path, context); filen ...
- ASP.NET Core 2.2 基础知识(三) 静态文件
什么是静态文件? HTML,CSS,JS,图片等都叫做静态文件. 要想提供静态文件给客户端,需要注册静态文件中间件. 我们先分别添加一个 WebAPI 项目,一个 Razor 视图项目,比较两个项目的 ...
- 《UNIX环境高级编程》笔记——1.UNIX基础知识
这一章节侧重一些基本概念和书中用到的一些名词. 一.引言 所有的操作都提供服务,典型的服务包括:执行新程序.打开文件.读写文件.分配存储区以及获得当前时间等. 二.UNIX体系结构 其实linux常见 ...
- UNIX环境高级编程 第1章 UNIX基础知识
所有操作系统都为运行在它之上的程序提供各种服务,典型的服务包括:执行新程序.打开文件.读写文件.分配存储空间.提供时间等. UNIX体系结构 严格来说,操作系统是一种软件,它控制计算机硬件资源,提供程 ...
- 第一章 UNIX 基础知识
1.1 Unix体系结构 OS定义为一种软件,它控制计算机硬件资源,提供程序运行环境,一般称其为内核(kernel),它体积小,位于环境中心. 内核的接口为系统调用(system call),共用函数 ...
- UNIX读书笔记----UNIX基础知识
UNIX体系结构: 从严格意义上讲,可将操作系统定义为一种软件,它控制计算机硬件资源,提供程序运行环境.我们通常将这种软件称为内核(Kernel),因为他相对较小,而且位于环境的核心.图片显示了UNI ...
- APUE(1)----UNIX基础知识
一.UNIX体系结构 所有操作系统都为他们所运行的程序提供服务,典型的服务包括:执行新程序.打开文件.读文件.分配存储区等.严格意义上来说,操作系统可以定义为一种软件,它控制计算机硬件资源,提供程序运 ...
随机推荐
- 你不知道的JavaScript--值得你挑战的JavaScript面试题(45题)
1,以下表达式的运行结果是: ["1","2","3"].map(parseInt) A.["1","2&qu ...
- Java 迭代器理解
1.Iterator(迭代器) 作为一种设计模式,迭代器可以用于遍历一个对象,对于这个对象的底层结构不必去了解. java中的Iterator一般称为“轻量级”对象,创建它的代价是比较小的.这里笔者不 ...
- Javascript 中的false、0、null、undefined和空字符串对象
在Javascript中,我们经常会接触到题目中提到的这5个比较特别的对象——false.0.空字符串.null和undefined.这几个对象很容易用错,因此在使用时必须得小心. 类型检测 我们下来 ...
- easyui datagrid导出excel
[第十四篇]easyui datagrid导出excel <a class="btn btn-app" onclick="exportExcel()" ...
- 跨服务器导入数据SQL语句及其问题解决方案
--跨服务器导入数据SQL语句: insert into [shsw_manager].[dbo].[Station_List]select * from OPENROWSET('SQLOLEDB', ...
- php中PCRE正则表达式分隔符的使用
转自:http://www.baiwar.com/post/the-use-of-php-pcre-regex-delimiter.html 在php5.3.0以前,PHP可使用两套正则表达式规则,一 ...
- Java:数组
数组 数组是一种引用数据类型(所以才会看到 new int[]),数组的长度初始化完成后是固定的.在内存中初始化数组后的空间就固定下来,即便数组中的内容被清空了,但在内存中占有的空间保留了下来,依然是 ...
- ruby在线学习
http://tryruby.org/ [Heroku空间] 免费ruby空间
- Hibernate的generator属性之意义
Hibernate的generator属性之意义 本文讲述Hibernate的generator属性的意义.Generator属性有7种class,本文简略描述了这7种class的意义和用法. Hib ...
- iOS App创建桌面快捷方式
http://www.cocoachina.com/ios/20150827/13243.html 先mark,暂时用不到