Advanced Programming in UNIX Environment Episode 19

本文介绍了如何使用chdir和fchdir函数更改进程的工作目录,并演示了如何获取当前工作目录的完整绝对路径。此外,还详细解释了如何通过文件系统的主次设备号来标识存储设备,以及如何获取特殊文件的设备号。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

参考资料:

### Python 中循环 Episode 的代码片段 在 Python 编程中,`for` 循环常用于遍历一系列的迭代对象,比如列表、元组或范围。当涉及到模拟多个 episode(例如,在强化学习环境中),可以使用 `range()` 函数来指定要执行的次数。 下面是一个简单的例子,展示了如何设置一个 for 循环来进行多次 episode 运行: ```python num_episodes = 10 # 定义想要运行的episode数量 for episode in range(num_episodes): # 使用range()函数创建从0到num_episodes-1的序列 print(f"Starting episode {episode + 1}") # 输出当前是第几个episode # 此处放置每轮episode的具体逻辑操作... print(f"Finished episode {episode + 1}\n") # 结束本轮后打印完成信息 ``` 在这个例子中,变量 `num_episodes` 设置了总的 episode 数目;而 `range(num_episodes)` 则会生成一个由整数组成的不可变序列,这些整数是从零开始直到 `num_episodes - 1` 。每次迭代时,都会更新 `episode` 变量,并可以在循环体内访问其值以跟踪进度或者作为参数传递给其他功能模块[^1]。 如果希望调整上述代码中的某些行为,可以根据具体需求更改 `num_episodes` 的数值大小或是向循环内部添加更多处理步骤。此外,还可以引入条件判断语句或其他控制结构使程序更加灵活多变。 #### 修改循环Episode的行为 假设现在有一个特定的任务需要每隔一定数量的 episodes 执行一次特殊动作,则可以通过增加额外的计数器以及相应的条件测试来实现这一点: ```python special_action_interval = 5 # 设定每隔多少个episodes触发一次特别行动 counter = 0 # 初始化辅助计数器 for episode in range(num_episodes): counter += 1 # 增加计数器 if counter % special_action_interval == 0: print(f"Performing special action at the end of episode {episode}") # 继续常规的episode流程... print("All episodes have been completed.") ``` 这里增加了两个新的元素:一个是用来记录已经过了多少个连续 episodes 的计数器 `counter`; 另外则是每当到达预设间隔(`special_action_interval`)就采取措施的一段逻辑分支。这样就可以轻松地扩展基础框架的功能而不改变原有核心部分的工作方式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值