刚刚开始看unix高级环境编程,看了一天,好像什么都懂,但是更像什么都不懂,先记一记,说不定下次再看的时候,会有新的感悟。
1.目录的一些操作
opendir,返回一个DIR结构的指针,将指针传入readdir函数,会读取里面的目录,直到里面的目录都被读取完。
#include "apue.h"
#include <dirent.h>
int main(int argc, char *argv[])
{
DIR *dp;
struct dirent *dirp;
if(argc != 2)
err_quit("usage: ls directory_name");
if((dp = opendir(argv[1])) == NULL)
err_sys("can't open %s", argv[1]);
while((dirp = readdir(dp)) != NULL)
printf("%s\n", dirp->d_name);
closedir(dp);
exit(0);
}
2.进程控制
主要是execlp在执行,另外父进程采用fork()创建子进程,fork对父进程返回新的子进程的进程ID,对子进程则返回0。
#include "apue.h"
#include <sys/wait.h>
static void sig_int(int);
int main(void)
{
char buf[MAXLINE];
pid_t pid;
int status;
if(signal(SIGINT, sig_int) == SIG_ERR)
err_sys("signal error");
printf("%% ");
while(fgets(buf, MAXLINE, stdin) != NULL){
if(buf[strlen(buf) - 1] == '\n')
buf[strlen(buf) - 1] = 0;
if((pid = fork()) < 0){
err_sys("fork error");
} else if(pid == 0){
execlp(buf, buf, (char *)0);
err_ret("couldn't execute: %s", buf);
exit(127);
}
if((pid = waitpid(pid, &status, 0)) < 0)
err_sys("waitpid error");
printf("%% ");
}
exit(0);
}
void sig_int(int signo)
{
printf("interrupt\n%% ");
}
3. 文件描述符。
0代表与标准输入关联,1代表与标准输出关联,2代表与标准错误关联。
4.open函数
主要有一系列的参数,例如O_RDONLY,O_WRONLY,O_RDWR等等。用它可以替代creat
5.close函数
int close(int fd); //fd代表文件标识符,成功返回0,出错返回-1。
6.lseek函数
off_t lseek(int fd, off_t offset, int whence); //成功返回文件的偏移量,失败返回-1
whence = SEEK_SET,则将该文件的偏移量设置为距文件开头offset个字节。
whence = SEEK_CUR,则将该文件的偏移量设置为其当前值加offset,offset可为正或负
whence = SEEK_END,则将该文件的偏移量设置为文件长度加上offset,offset可为正或负
7.当文件偏移量大于文件的长度时,会形成文件空洞,用0填充。
8.read函数
ssize_t read(int fd, void *buf, size_t nbytes); //返回值:读到的字节数,如果已到文件尾,返回0;若出错,返回-1
从终端设备读,通常一次最多读一行。
9.write函数
ssize_t write(int fd, char *buf, unsigned nbytes); //若成功,返回已写的字节数,如出错返回-1。
10.原子操作。 多步操作组合成的一个操作,要么不执行,要么执行完。
11.dup,dup2。
更改设置文件标志符。
int dup(int fd); //返回当前文件描述符中的最小数值
int dup2(int fd, int fd2); //类似与fd = fd2,并且关闭fd2
12. sync, fsync, fdatasync.
sync只是将修改过的块缓冲区排入写队列,就返回,不等待实际写磁盘操作结束。
fsync只对一个文件起作用,并且要等待磁盘操作结束后再返回。
fdatasync只影响数据部分。
原型:void sync(void),int fsync(int fd),int fdatasync(int fd);
13.fcntl函数(改变打开文件的属性)
int fcntl(int fd, int cmd, .....);
主要是一系列的命令参数,比如F_GETFD,F_SETFD,F_GETFL,F_SETFL。
#include "apue.h"
#include <fcntl.h>
int main(int argc, char *argv[])
{
int val;
if(argc != 2)
err_quit("usage: a.out <descriptor#>");
if((val = fcntl(atoi(argv[1]), F_GETFL, 0)) < 0)
err_sys("fcntl error for fd %d", atoi(argv[1]));
switch(val & O_ACCMODE){
case O_RDONLY:
printf("read only");
break;
case O_WRONLY:
printf("write only");
break;
case O_RDWR:
printf("read write");
break;
default:
err_dump("unknown access mode");
}
if(val & O_APPEND)
printf(", append");
if(val & O_NONBLOCK)
printf(", nonblocking");
if(val & O_SYNC)
printf(", synchronous writes");
#if !defined(_POSIX_X_SOURCE) && defined (O_FSYNC) && (O_FSYNC != O_SYNC)
if(val & O_FSYNC)
printf(", sychronous writes");
#endif
putchar('\n');
exit(0);
}
14.函数ioctl和/dev/fd 还不是太理解。