Advanced Programming in UNIX Environment Episode 19

进程调用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

这里写图片描述
文件访问权限小结

参考资料:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值