进程调用chdir或fchdir函数可以更改当前工作目录
#include <unistd.h>
int chdir(const char *pathname);
int fchdir(int fd);
在这两个函数中,分别用pathname或打开文件描述符来指定新的当前工作目录。
#include "apue.h"
int main(void)
{
if(chdir("/tmp")<0)
err_sys("chdir failed");
printf("chdir to /tmp succeeded\n");
return 0;
}
得到当前工作目录完整的绝对路径
#include <unistd.h>
char *getcwd(char *buf, size_t size);
必须向此函数传递两个参数,一个是缓冲区地址buf,另一个是缓冲区的长度size(以字节为单位)。该缓冲区必须有足够的长度以容纳绝对路径名再加上一个终止null字节。
#include "apue.h"
int main(void)
{
char *ptr;
size_t 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);
return 0;
}
设备特殊文件
- 每个文件系统所在的存储设备都由其主、次设备号表示。
- 我们通常可以使用两个宏:major和minor来访问主、次设备号,大多数实现都定义这两个宏。
- 系统中与每个文件名关联的st_dev值是文件系统的设备号,文件系统包含了这一文件名以及其对应的i节点。
- 只有字符特殊文件和块特殊文件才有st_rdev值。此值包含实际设备设备号。
代码实现 1:
#include "apue.h"
#ifdef SOLARIS
#include <sys/mkdev.h>
#endif
//这是多出的一行,系统实现有所改变
#include <sys/sysmacros.h>
int main(int argc, char *argv[])
{
int i;
struct stat buf;
for(i=1;i<argc;i++)
{
printf("%s: ",argv[i]);
if(stat(argv[i],&buf)<0)
{
err_ret("stat error");
continue;
}
printf("dev = %d/%d", major(buf.st_dev),minor(buf.st_dev));
if(S_ISCHR(buf.st_mode)||S_ISBLK(buf.st_mode))
{
printf(" (%s) rdev = %d/%d",(S_ISCHR(buf.st_mode))?"character":"block",
major(buf.st_rdev),minor(buf.st_rdev));
}
printf("\n");
}
return 0;
}
打印st_dev和st_rdev的值
S_IRWXU=S_IRUSR|S_IWUSR|S_IXUSR
S_IRWXG=S_IRGRP|S_IWGRP|S_IXGRP
S_IRWXO=S_IROTH|S_IWOTH|S_IXOTH
文件访问权限小结
参考资料: