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库的函数,涉及到文件流,为了系统点,全部记在明天的日记里,
方便前后只是的连贯性!

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

时间: 2024-11-06 19:46:08

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

Linux基础知识--Linux的文件系统和bash的基础特性

Linux基础知识--linux的文件系统和bash的基础特性 一.Linux文件系统: Linux文件系统中的文件是数据的集合,文件系统不仅包含着文件中的数据而且还有文件系统的结构,所有Linux 用户和程序看到的文件.目录.软连接及文件保护信息等都存储在其中 linux文件系统遵循FHS(Filesystem Hierarchy Standard,文件系统目录标准),多数Linux版本采用这种文件组织形式.FHS采用了树行组织文件. FHS定义了两层规范,第一层是,/目录下面的各个目录应该要

APUE 学习笔记(一) Unix基础知识

1. Unix 体系结构 内核的接口被称为系统调用 公用函数库构建在系统调用接口之上 应用软件既可以调用公用函数库,也可以直接进行系统调用 2. 文件和目录 目录操作函数:opendir---> readdir---> closedir struct dirent 结构体 stat 系统调用 3.程序.进程.线程 程序:存放在磁盘上.并处于某个目录中的一个可执行文件.使用exec系列函数将程序从磁盘读入存储器,并使其执行 进程:程序的执行实体.进程控制的3个函数:fork.exec.waitp

Java基础知识之IO(2)

文件复制小案例(温习Java基础知识之IO(1)中的知识) package copy; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; public class CopyDemo { public stat

APUE第一章 UNIX基础知识

前语:本人是半路出家做程序员,实际上应付平时工作中的业务还可以,但是基础知识实在薄弱,当然也跟中国计算机教育有关系,平时跟同事聊天,实际上就算是科班出身,对于计算机本身的了解也知之甚少,因此在毕业两周年到来的时候,给自己确定了以后的技术学习方向,同时也决定了将基础部分补充起来,特来CSDN开这个专题,去学习程序员圣经般著作-<UNIX高级环境编程>,这本书也是被某个同事经常提起,书本比较厚,但是不能操之过急,但是也不要指望一次性就能学完学透,没事回来看看,总有收获,自勉之. 一.UNIX体系结

第一章 UNIX 基础知识

1.1 Unix体系结构 OS定义为一种软件,它控制计算机硬件资源,提供程序运行环境,一般称其为内核(kernel),它体积小,位于环境中心. 内核的接口为系统调用(system call),共用函数库构建在系统调用上,应用软件既可以使用公用函数库,也可以使用系统调用.shell是一种特殊的应用程序,它为运行其他应用程序提供一个接口. 下图为 UNIX 体系结构: 广义上,OS包括内核和一些软件,例如 Linux 是 GNU 操作系统使用的内核,可以称这种操作系统为 GNU/Linux,但是通常

自学:Unix环境高级编程 第一章 Unix基础知识

1.2 Unix体系结构 内核(kernel):控制计算机硬件资源,提供程序运行环境. 系统调用(system call):内核的接口. 公用函数库构建在系统调用接口之上. 应用程序既可使用公用函数库,也可使用系统调用 shell是一个特殊的应用程序,为运行其他应用程序提供了一个接口. 1.3 登录    1.登录名 系统在其口令文件(通常是/etc/passwd文件)中查看登录名. 例如:sar:x:205:105:Stephen Rago:/home/sar:/bin/ksh 口令文件中的登

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

一.UNIX体系结构 所有操作系统都为他们所运行的程序提供服务,典型的服务包括:执行新程序.打开文件.读文件.分配存储区等.严格意义上来说,操作系统可以定义为一种软件,它控制计算机硬件资源,提供程序运行环境.我们也将这种软件成为内核,因为它相对较小,并且位于环境的核心.内核的接口被称为系统调用.公共函数库构建在之上,普通的应用程序可以调用系统调用,也可以调用公共函数库.shell是一个特殊的应用程序,位运行其他应用程序提供了一个接口. 二.文件和目录 1.文件系统 UNXI文件系统是目录和文件的

基础知识之----------IO流(4)操作文件

1.文件的切割合并 public class SpliFileDemo { //创建1M的缓冲区 private static int SIZE=1048576; public static void main(String[] args) throws IOException { File file=new File("c://partfile"); // splitFile(file); mergeFile(file); } public static void splitFile

JAVA核心技术I---JAVA基础知识(Jar文件导入导出)

一:Jar初识 (一)定义 同c++中的DLL一样 jar文件,一种扩展名为jar的文件,是Java所特有的一种文件格式,用于可执行程序文件的传播. jar文件实际上是一组class文件的压缩包 (二)优势 –jar文件可以包括多个class,比多层目录更加简洁实用–jar文件经过压缩,只有一个文件,在网络下载和传播方面,更具有优势–jar文件只包括class,而没有包含java文件,在保护源文件知识版权方面,能够可以起到更好的作用–将多个class文件压缩成jar文件(只有一个文件),可以规定