Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C程序中更改Linux shell中的工作目录_C_Linux_Shell_Directory - Fatal编程技术网

在C程序中更改Linux shell中的工作目录

在C程序中更改Linux shell中的工作目录,c,linux,shell,directory,C,Linux,Shell,Directory,我的目标是编写一个类似于Linux基本shell的C程序。我有一切工作,除了改变工作目录。我已经尝试了system()来查找cd的输入字符串,但什么都没有发生。我还尝试了chdir(“标记字符串”),但也没有成功。有人有什么想法吗?这是我代码的一部分: fgets(cmdStr, sizeof(cmdStr), stdin); if( strncmp("quit", cmdStr, 4) == 0 || strncmp("Quit", cmdStr, 4) ==

我的目标是编写一个类似于Linux基本shell的C程序。我有一切工作,除了改变工作目录。我已经尝试了
system()
来查找
cd
的输入字符串,但什么都没有发生。我还尝试了
chdir(“标记字符串”)
,但也没有成功。有人有什么想法吗?这是我代码的一部分:

        fgets(cmdStr, sizeof(cmdStr), stdin);

        if( strncmp("quit", cmdStr, 4) == 0 || strncmp("Quit", cmdStr, 4) == 0  )
        {
            break;
        }
        else if( strncmp("cd", cmdStr, 2) == 0 )
        {
            char *token = strtok(cmdStr, " ");
            token = strtok(NULL, " ");
            chdir(token);
        }
        else
        {
            system(cmdStr);
        }
    }
有可能这样做吗?或者这是一个简单的例子,与儿童外壳不能做某些事情有关


编辑:以上代码已完成。

您的chdir调用失败,返回值为-1

请尝试按如下方式打印
errno

errno = 0;
chdir(token);
if ( errno != 0 ) {
    printf( "Error changing dir: %s\n", strerror( errno ) );
}
基思是正确的:
\n
最后会杀了你

您可以执行以下操作来消除它:

char *ptr = cmdStr;
<snip>
    else if( strncmp("cd", cmdStr, 2) == 0 )
    {
            strsep(&ptr, " ");       /* skip "cd"   */
            char *chr = strsep(&ptr, "\n");   /* skip "\n"  */
            errno = 0;
            chdir(chr);
            if ( errno != 0 )
               printf( "Error changing dir: %s\n", strerror( errno ) );
    }
</snip>
char*ptr=cmdStr;
else if(strncmp(“cd”,cmdStr,2)==0)
{
STREP(&ptr,“”)/*跳过“cd”*/
char*chr=strep(&ptr,“\n”);/*跳过“\n”*/
errno=0;
chdir(chr);
如果(错误号!=0)
printf(“更改目录时出错:%s\n”,strerror(errno));
}

您的
chdir
调用失败,返回值为
-1

请尝试按如下方式打印
errno

errno = 0;
chdir(token);
if ( errno != 0 ) {
    printf( "Error changing dir: %s\n", strerror( errno ) );
}
基思是正确的:
\n
最后会杀了你

您可以执行以下操作来消除它:

char *ptr = cmdStr;
<snip>
    else if( strncmp("cd", cmdStr, 2) == 0 )
    {
            strsep(&ptr, " ");       /* skip "cd"   */
            char *chr = strsep(&ptr, "\n");   /* skip "\n"  */
            errno = 0;
            chdir(chr);
            if ( errno != 0 )
               printf( "Error changing dir: %s\n", strerror( errno ) );
    }
</snip>
char*ptr=cmdStr;
else if(strncmp(“cd”,cmdStr,2)==0)
{
STREP(&ptr,“”)/*跳过“cd”*/
char*chr=strep(&ptr,“\n”);/*跳过“\n”*/
errno=0;
chdir(chr);
如果(错误号!=0)
printf(“更改目录时出错:%s\n”,strerror(errno));
}
fgets()
cmdstr
中保留尾部的
'\n'
字符

如果键入
cd foo
,您将调用
chdir(“foo\n”)
,而不是
chdir(“foo”)

fgets()
cmdstr
中保留尾随的
'\n'
字符


如果键入
cd foo
,您将调用
chdir(“foo\n”)
,而不是
chdir(“foo”)

chdir
是否正确。它的返回值是多少?如果-1,什么是错误号?(始终检查系统调用的返回值。)@Nemo无论字符串是什么,返回值都是-1。使用不同的字符串尝试了多次。不确定如何检查它与-1一起产生的错误。有什么建议吗?我只想指出,您使用
strncmp
的方式意味着
cdxxx foo
相当于
cd foo
。要获得更一般的功能,请首先将字符串解析为标记,然后检查第一个标记是否为
“cd”
。(这个问题已经有5年了,所以这可能不相关,但未来的读者可能会感兴趣。)
chdir
是正确的。它的返回值是多少?如果-1,什么是错误号?(始终检查系统调用的返回值。)@Nemo无论字符串是什么,返回值都是-1。使用不同的字符串尝试了多次。不确定如何检查它与-1一起产生的错误。有什么建议吗?我只想指出,您使用
strncmp
的方式意味着
cdxxx foo
相当于
cd foo
。要获得更一般的功能,请首先将字符串解析为标记,然后检查第一个标记是否为
“cd”
。(这个问题已经5年了,所以这可能不相关,但未来的读者可能会感兴趣。)错误更改目录:未知错误18446744073709551615不确定这意味着什么,谷歌也没有帮助…做了一些改变,现在我得到了这个:错误更改目录:没有这样的文件或目录现在我们有进展了。确保从您的
pwd
,您尝试
cd
的目录是可行的。尝试提供
绝对路径。如果在程序运行时我在程序中键入目录名,我会得到以下信息:/home sh:/home:是一个目录,但键入cd/home除了产生错误外,什么都不会做。嗯。也尝试了绝对路径。错误更改目录:未知错误18446744073709551615不确定这意味着什么,谷歌也没有帮助…做了一些改变,现在我得到了这个:错误更改目录:没有这样的文件或目录现在我们正在某处。确保从您的
pwd
,您尝试
cd
的目录是可行的。尝试提供
绝对路径。如果在程序运行时我在程序中键入目录名,我会得到以下信息:/home sh:/home:是一个目录,但键入cd/home除了产生错误外,什么都不会做。嗯。还尝试了绝对路径。