【问题标题】:How to use chdir system function如何使用chdir系统功能
【发布时间】:2015-09-20 12:54:21
【问题描述】:

我正在尝试使用 chdir 来更改我的进程的工作目录。假设我的当前目录中有一个苹果目录。为什么当我在提示符中输入apple时返回的结果是-1?是不是因为当我输入apple时,'\n'字符也放在了字符串的末尾? 另外,如果我可以只使用一个变量来存储它,那么更改目录是什么意思?

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

int main(void){
    char path[256];
    fgets(path, 256, stdin);
    printf("%s", path);
    int result = chdir(path);
    if(result != 0){
        printf("%d\n", result);
    }
}

【问题讨论】:

  • 对于chdir(),请参见此处:man7.org/linux/man-pages/man2/chdir.2.html 或在您的控制台上输入man 2 chdir
  • 您对包含换行符的“路径”变量的正确看法。有几种方法可以消除换行符。我使用:char *newline = strstr( path, "\n"); if (newline) { *newline = '\0';}
  • 注意:由于程序运行在一个单独的进程中,当程序退出时,当前工作目录将与程序运行前保持一致。

标签: c fgets cd chdir


【解决方案1】:

fgets() 给结果加上后缀 可能(如果没有收到EOF)读取换行符(在IXish 系统上为\n)并将其传递给chdir() 使后一个 choke 作为要更改为最可能的目录名称不带有尾随换行符。

来自man fgets()我的斜体):

fgets() 从流中最多读入一个小于 size 的字符,并将它们存储到 s 指向的缓冲区中。在 EOF 或换行符后停止读取。 如果读取了换行符,则将其存储到缓冲区中。


关于调试的说明:如果您将要打印的“字符串”(由fgets() 读取)放在这样的引号中

printf("'%s'", path);

您可能已经注意到尾随的\n

【讨论】:

  • 我明白了,但你能告诉我 chdir 的真正作用是什么吗?因为我正在写一个作业来实现shell的cd功能?
  • @lplouis: chdir() 更改进程的当前工作目录。
  • Nitpick: fgets(3) 没有\n 为结果添加后缀。它只是将其从输入复制到缓冲区。如果在没有\n 的情况下到达EOF,则缓冲区不会有尾随换行符-您的答案似乎另有说明。
  • @FilipeGonçalves:已更正。
猜你喜欢
  • 1970-01-01
  • 2013-06-25
  • 1970-01-01
  • 2017-05-16
  • 2013-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多