最近在做 “类ftp文件传输云盘” 的一个文件管理系统时,在实现 “cd” 命令功能时调用chdir函数跳转目录,但是一直出现 “chdir: No such file or directory” 此错误。再三检查发现问题出现在换行符 "\n"。
补充(了解跳过):
chdir() 函数的使用
头文件:#include <unistd.h>
定义函数:int chdir(const char * path);
参数:指向目标目录的指针
函数说明:chdir()用户将当前的工作目录改变成以参数路径所指的目录。
返回值执行成功则返回0,失败返回-1,errno为错误代码。
为什么不直接调用 system 函数来跳转目录呢?
因为调用 system 函数相当于 fork 出一个子进程来处理跳转目录,子进程执行了 cd 命令后改变了自己的 pwd, 但是子进程执行完后会消亡,而父进程的路径没有改变,所以不能使用 system 函数来跳转目录。
部分代码:
//字符串分割,获取路径
char *stringStrtok(char *buf)
{
char *p = NULL;
p = strtok(buf," ");
p = strtok(NULL," ");
return p;
}
ret = stringStrtok(msg.cmd); //获取路径
printf("current folder:%s\n",ret); //打印获取到的路径
int are = chdir(ret); //跳转到路径目录
if(are == -1){
perror("chdir"); //打印错误信息
}
else{
strcpy(msg.data,"chair success!\n"); //字符串拷贝
write(c_fd,&msg,sizeof(msg)); //将字符串写入结构体
}
break;
补充:strtok()函数
-
char *strtok(char *str, const char *delim);
-
参数1:欲分割的字符串
-
参数2:分隔字符串
当strtok()在参数s的字符串中发现到参数delim的分割字符时则会将该字符改为\0字符。在第一次调用时,strtok()必需给予参数s字符串,往后的调用则将参数s设置成NULL。每次调用成功则返回下一个分割后的字符串指针。
返回值:返回下一个分割后的字符串指针,如果已无从分割则返回NULL。
出现此错误的原因在于 如果用户通过回车键或通过EOF (Linux上的ctrl + d)字符输入字符串,这将会运行。
例如 fgets()函数:
fgets() reads in at most one less than size characters from stream and stores them into the buffer pointed to by s. Reading stops after an EOF or a newline. If a newline is read, it is stored into the buffer.
fgets()从流中最多读入一个小于size的字符,并将它们存储到s所指向的缓冲区中。读取在EOF或换行符后停止。如果读取了换行符,则将其存储到缓冲区中。
问题是有一个换行符'\n'在你从fgets()得到的字符串的末尾,你需要删除它:
所以在调用strtok()函数时,应该写strtok(....," \n"),以防字符串以EOF或其它形式结束。
修改之后的运行效果:
总结:
1、在涉及到获取用户输入时要注意换行符的处理,"\n"也输入一个字符,应该考虑到。
2、在涉及到数组的处理时要注意结束符 "\0",它是自动补充的,会起到作用,特别是涉及到数组的空间开辟以及访问时应该被注意。