《UNIX环境高级编程》笔记--目录操作

1.mkdir函数

使用mkdir函数创建目录。

#include <sys/stat.h>
int mkdir(const char* pathname, mode_t mode);

如果成功返回0,失败返回-1.

此函数创建一个新的空目录,其中.和..目录是自动创建的,所指定的访问权限由mode指定。目录至少设置一个执行权限。

实践:

#include <stdio.h>
#include <fcntl.h>
#include <sys/stat.h>

int main(void){
        if(mkdir("mkdirtest",S_IRUSR|S_IWUSR|S_IXUSR)<0){
                perror("mkdir");
                return -1;
        }
        return 0;
}
运行结果:

yan@yan-vm:~/apue$./a.out
yan@yan-vm:~/apue$ ll
drwxrwxr-x  4 yan       yan       4096 Jul 10 13:25 ./
drwx---rwx 25 yan       yan       4096 Jul 10 13:25 ../
drwx------  2 yan       yan       4096 Jul 10 13:25 mkdirtest/


2.rmkdir函数

使用rmdir函数可以删除一个空目录,空目录只包含.和..这两项目录。

#include <unistd.h>
int rmdir(const char* pathname);

如果成功则返回0,如果出错返回-1.

实践:

#include <stdio.h>
#include <unistd.h>

int main(void){
        if(rmdir("mkdirtest")<0){
                perror("rmdir");
                return -1;
        }
        return 0;
}
运行结果:

yan@yan-vm:~/apue$ ll mkdirtest/
total 8
drwxrwxr-x 2 yan yan 4096 Jul 10 13:37 ./
drwxrwxr-x 4 yan yan 4096 Jul 10 13:37 ../
yan@yan-vm:~/apue$ ./a.out
yan@yan-vm:~/apue$ ll mkdirtest
ls: cannot access mkdirtest: No such file or directory

如果目录内容不为空,会怎么样?

yan@yan-vm:~/apue$ ll mkdirtest/
total 8
drwxrwxr-x 2 yan yan 4096 Jul 10 13:38 ./
drwxrwxr-x 4 yan yan 4096 Jul 10 13:38 ../
-rw-rw-r-- 1 yan yan    0 Jul 10 13:38 a
yan@yan-vm:~/apue$ ./a.out
rmdir: Directory not empty

删除会出错。


3.读取目录信息

通过以下函数可以读取目录的信息。

#include <dirent.h>
DIR *opendir(const char* pathname); //如果成功返回指针,出错则返回NULL。
struct dirent* readdir(DIR* dp); //如果成功返回指针,若在目录结果或者出错则返回NULL。
void rewinddir(DIR* dp); //用来设置参数dir 目录流目前的读取位置为原来开头的读取位置。
int closedir(DIR* dp); //如果成功则返回0,出错则返回-1。
long telldir(DIR* dp); //返回dp关联的目录中的当前位置。
void seekdir(DIR* dp, long loc); //用来设置参数dir目录流目前的读取位置。

其中dirent的结构如下:

struct dirent{
	int_t d_ino; //i_node number;
	char d_name[NAME_MAX+1];
}


实践:

#include <stdio.h>
#include <dirent.h>

int main(int argc, char* argv[]){
        int result = 0;
        DIR* dir = NULL;
        struct dirent* ptr;

        if(argc != 2){
                printf("parameter error.\n");
                result = -1;
                goto FINALLY;
        }

        if((dir = opendir(argv[1])) == NULL){
                perror("opendir");
                result = -1;
                goto FINALLY;
        }

        while((ptr = readdir(dir)) != NULL){
                printf("d_name:%s\n",ptr->d_name);
        }

        rewinddir(dir);

        printf("readdir again.\n");
        while((ptr = readdir(dir)) != NULL){
                printf("d_name:%s\n",ptr->d_name);
        }
FINALLY:
        if(dir != NULL){
                closedir(dir);
        }
        return result;
}
运行结果:

yan@yan-vm:~/apue$ ll dirtest/
total 8
drwxrwxr-x 2 yan yan 4096 Jul 10 14:00 ./
drwxrwxr-x 4 yan yan 4096 Jul 10 14:22 ../
-rw-rw-r-- 1 yan yan    0 Jul 10 13:59 12345
-rw-rw-r-- 1 yan yan    0 Jul 10 14:00 67890
-rw-rw-r-- 1 yan yan    0 Jul 10 13:59 abc
-rw-rw-r-- 1 yan yan    0 Jul 10 13:59 def
-rw-rw-r-- 1 yan yan    0 Jul 10 13:59 ghi
yan@yan-vm:~/apue$ ./a.out dirtest/
d_name:..
d_name:ghi
d_name:abc
d_name:12345
d_name:def
d_name:67890
d_name:.
readdir again.
d_name:..
d_name:ghi
d_name:abc
d_name:12345
d_name:def
d_name:67890
d_name:.


#include <stdio.h>
#include <dirent.h>

int main(int argc, char* argv[]){
        int result = 0;
        DIR* dir = NULL;
        struct dirent* ptr;
        int offset;

        if(argc != 2){
                printf("parameter error.\n");
                result = -1;
                goto FINALLY;
        }

        if((dir = opendir(argv[1])) == NULL){
                perror("opendir");
                result = -1;
                goto FINALLY;
        }

        offset = telldir(dir);

        while((ptr = readdir(dir)) != NULL){
                printf("d_name:%s\n",ptr->d_name);
        }

        seekdir(dir, offset);

        printf("readdir again.\n");
        while((ptr = readdir(dir)) != NULL){
                printf("d_name:%s\n",ptr->d_name);
        }
FINALLY:
        if(dir != NULL){
                closedir(dir);
        }
        return result;
}
运行结果:

yan@yan-vm:~/apue$ ll dirtest/
total 8
drwxrwxr-x 2 yan yan 4096 Jul 10 14:00 ./
drwxrwxr-x 4 yan yan 4096 Jul 10 14:25 ../
-rw-rw-r-- 1 yan yan    0 Jul 10 13:59 12345
-rw-rw-r-- 1 yan yan    0 Jul 10 14:00 67890
-rw-rw-r-- 1 yan yan    0 Jul 10 13:59 abc
-rw-rw-r-- 1 yan yan    0 Jul 10 13:59 def
-rw-rw-r-- 1 yan yan    0 Jul 10 13:59 ghi
yan@yan-vm:~/apue$ ./a.out dirtest/
d_name:..
d_name:ghi
d_name:abc
d_name:12345
d_name:def
d_name:67890
d_name:.
readdir again.
d_name:..
d_name:ghi
d_name:abc
d_name:12345
d_name:def
d_name:67890
d_name:.


4.chdir、fchdir和getcwd函数

每个进程都有一个当前工作目录,此目录是搜索所有相对路径的起点,进程通过调用chdir和fchdir函数可以更改当前工作目录:
#include <unistd.h>
int chdir(const char* pathname);
int fchdir(int filedes);
如果成功则返回0,出错则返回-1.

使用getcwd函数获取进程当前工作目录的绝对路径。

#include <unistd.h>
char* getcwd(char* buf, size_t size);

如果成功返回buf,失败则返回NULL。


实践:

#include <stdio.h>
#include <unistd.h>

int main(void){
        char path[256];

        printf("path:%s\n",getcwd(path,256));
        if(chdir("/tmp") < 0){
                perror("chdir");
                return -1;
        }
        printf("path:%s\n",getcwd(path,256));
        return 0;
}
运行结果:
yan@yan-vm:~/apue$ pwd
/home/yan/apue
yan@yan-vm:~/apue$ ./a.out
path:/home/yan/apue
path:/tmp
yan@yan-vm:~/apue$ pwd
/home/yan/apue

可见,执行程序后,shell的当前目录没有改变,其原因是shell创建一个子进程,由该子进程具体执行程序,由此可见,为了改变

shell进程自己的目录,shell应该直接调用chdir,所以cd命令是直接包含在shell程序中的。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
UNIX环境高级编程笔记是关于在UNIX系统中进行高级编程的一些笔记和技巧的记录。这些笔记主要涉及文件I/O和进程管理等方面的内容。在UNIX系统中,文件I/O是通过文件描述符来进行操作的。文件描述符是一个整数,用来标识打开的文件。为了实现跨平台的兼容性,可以使用POSIX标准来进行文件操作。POSIX是一个操作系统接口的标准,它以UNIX为基础,但并不限于UNIX类系统。此外,Single UNIX Specification简称SUS,它是POSIX.1标准的一个超集,定义了UNIX系统的实现标准。在UNIX系统中,进程的初始化是由init进程来完成的。init进程会读取文件/etc/ttys,并根据其中定义的终端设备进行处理。对于每个允许登录的终端设备,init进程会调用fork函数生成一个子进程,并通过exec函数执行getty程序来处理该终端设备。通过这些技巧和方法,可以实现在UNIX环境下进行高级编程的需求。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [UNIX环境高级编程笔记](https://blog.csdn.net/qq_55537010/article/details/127837953)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [《UNIX环境高级编程》学习笔记](https://blog.csdn.net/qq_42526420/article/details/123143423)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值