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. --专访雷果国: 从1.5K到18K 一个程序员的5年成长之路--

    导语:今年三月份,在CSDN博客和新浪微博上有一篇<从1.5K到18K,一个程序员的5年成长之路>被众人分享和传阅,这篇博文首先介绍了作者自学之初薄弱的基础,然后通过流水账形式分享了那个从 ...

  2. easyui的基本用法

    之前有用过extjs,最近发现easyui和fineui和extjs比较类似,并且稍微简单一点,所以考虑使用. 以下是项目中的具体简单应用 function callback2d(data) {//d ...

  3. SqlServer中把结果集放到到临时表的方法

    一. SELECT INTO   1. 使用select into会自动生成临时表,不需要事先创建   select * into #temp from sysobjects   01. 把存储过程结 ...

  4. 报错解决:No Hibernate Session bound to thread, and configuration does not allow creation of non-transactional one here

    大概分析一般使用了注解才会报这方面的错 1.没有在spring的ApplicationContext.xml中开启注解事务 <!-- 开启注解事务 --> <tx:annotatio ...

  5. 开源牛人 zcbenz

    事情是这样的,微软推出了Visual Studio Code,我很好奇他怎么做跨平台的,所以就找找资料,在他的网站中是这么描述的: Architecturally, Visual Studio Cod ...

  6. (转)mysql的增删改查

    MySQL数据库的增删改查. 1,首先启动mysql数据库的服务,在运行的窗口中输入:net start mysql,这样,就可 以启动mysql数据库的服务,同理,输入net stop mysql, ...

  7. jdk和tomcat环境部署

    部署前需要准备的东西: 1.确定操作系统(32位或64位) 2.准备对应的jdk和tomcat软件 3.准备一份环境变量配置说明,省的到时候忘记了 步骤: 1.安装JDK 安装好JDK后,再配置JDK ...

  8. HookIAT的启动程序

    // 启动程序.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <Windows.h> #include &l ...

  9. POJ 1328 Radar Installation 贪心 难度:1

    http://poj.org/problem?id=1328 思路: 1.肯定y大于d的情况下答案为-1,其他时候必定有非负整数解 2.x,y同时考虑是较为麻烦的,想办法消掉y,用d^2-y^2获得圆 ...

  10. POJ 1012 Joseph 推导,暴力,约瑟夫环,打表 难度:2

    http://poj.org/problem?id=1012 答案以954ms飘过,不过这道题可以轻松用打表过 思路:如果我们把每个人位于数组中的原始编号记为绝对编号,每次循环过后相对于绝对编号为0的 ...