为什么这个 C 程序在 Ubuntu 中什么都不做?
Why is this C program doing nothing in Ubuntu?
我非常简单的 C 程序挂起,我不知道为什么。
每次开始新的编程会话时,我都在尝试制作一个简单的可执行文件来处理多个单调的操作。
所以我决定使用一些简单的东西(如下),但每次我 运行 它时,应用程序都会挂起,永远不会 returns。所以我必须使用 Ctrl-C 退出它。我已经添加了 printf 命令来查看它是否在任何地方,但那些从未出现过。
我的构建命令returns没有错误信息:
gcc -o tail tail.c
只是好奇我错过了什么。
#include <stdio.h>
#include <unistd.h>
int main() {
chdir("\var\www");
return 0;
}
源代码至少有两个问题:
您当前目录中不太可能有一个名为 \var\www
的 sub-directory — Ubuntu 使用 /
而不是 \
用于路径分隔符。
即使 sub-directory 的名称正确,您的程序也会将目录更改为它,但这不会影响调用程序。
您应该检查 chdir()
中的 return 值 — 至少:
if (chdir("/var/www") != 0)
{
perror("chdir");
exit(EXIT_FAILURE);
}
并且,与 Max 一样,通过 well-known 实用程序的名称调用您的程序,例如 tail
可能会导致混淆。使用不同的名称。
顺便说一句,也不要使用 test
作为程序名称。这也将导致混淆,因为它是 shell built-in 以及 /bin
或 /usr/bin
中的可执行文件。您的机器上还有一个程序 /bin/cd
或 /usr/bin/cd
— 它会检查它是否可以更改目录,但不会影响 shell 的当前目录。您必须通过完整路径名显式调用它才能将其完全转到 运行 因为 cd
是另一个 shell built-in.
两件事:
首先,这不是 Linux 路径的样子
其次,检查 chdir()
中的 return 值
即
if (chdir("/var/www") != 0)
printf("failed to change directory");
最后,chdir()
的效果会持续整个节目的持续时间。此程序完成后,它不会更改 shell 的当前目录。
其他答案充分涵盖了您的 C 代码中的问题。但是,您看到它 hang 的原因是因为您为程序选择了名称 tail
。
在Linux中,tail
在大多数设置中是/usr/bin
中的一个命令,如果你只是在命令行输入tail
,shell 首先搜索 $PATH
,然后运行它。如果没有任何参数,它会等待其标准输入的输入。您可以通过按 control-d 标记文件结尾来结束它。
您可以通过键入 ./tail
来绕过 $PATH
查找。
$ tail
[system tail]
$ ./tail
[tail in your current directory]
将./
作为一种习惯使用是个好主意,但您也可以通过不将程序命名为与常用命令相同的方式来避免混淆。另一个要避免的名称是 test
,它是一个 shell built-in 用于测试文件的各个方面,但似乎什么都不做,因为它在其系统 return 代码中报告结果。
我非常简单的 C 程序挂起,我不知道为什么。
每次开始新的编程会话时,我都在尝试制作一个简单的可执行文件来处理多个单调的操作。
所以我决定使用一些简单的东西(如下),但每次我 运行 它时,应用程序都会挂起,永远不会 returns。所以我必须使用 Ctrl-C 退出它。我已经添加了 printf 命令来查看它是否在任何地方,但那些从未出现过。
我的构建命令returns没有错误信息:
gcc -o tail tail.c
只是好奇我错过了什么。
#include <stdio.h>
#include <unistd.h>
int main() {
chdir("\var\www");
return 0;
}
源代码至少有两个问题:
您当前目录中不太可能有一个名为
\var\www
的 sub-directory — Ubuntu 使用/
而不是\
用于路径分隔符。即使 sub-directory 的名称正确,您的程序也会将目录更改为它,但这不会影响调用程序。
您应该检查 chdir()
中的 return 值 — 至少:
if (chdir("/var/www") != 0)
{
perror("chdir");
exit(EXIT_FAILURE);
}
并且,与 Max tail
可能会导致混淆。使用不同的名称。
顺便说一句,也不要使用 test
作为程序名称。这也将导致混淆,因为它是 shell built-in 以及 /bin
或 /usr/bin
中的可执行文件。您的机器上还有一个程序 /bin/cd
或 /usr/bin/cd
— 它会检查它是否可以更改目录,但不会影响 shell 的当前目录。您必须通过完整路径名显式调用它才能将其完全转到 运行 因为 cd
是另一个 shell built-in.
两件事:
首先,这不是 Linux 路径的样子
其次,检查
中的 return 值chdir()
即
if (chdir("/var/www") != 0)
printf("failed to change directory");
最后,chdir()
的效果会持续整个节目的持续时间。此程序完成后,它不会更改 shell 的当前目录。
其他答案充分涵盖了您的 C 代码中的问题。但是,您看到它 hang 的原因是因为您为程序选择了名称 tail
。
在Linux中,tail
在大多数设置中是/usr/bin
中的一个命令,如果你只是在命令行输入tail
,shell 首先搜索 $PATH
,然后运行它。如果没有任何参数,它会等待其标准输入的输入。您可以通过按 control-d 标记文件结尾来结束它。
您可以通过键入 ./tail
来绕过 $PATH
查找。
$ tail
[system tail]
$ ./tail
[tail in your current directory]
将./
作为一种习惯使用是个好主意,但您也可以通过不将程序命名为与常用命令相同的方式来避免混淆。另一个要避免的名称是 test
,它是一个 shell built-in 用于测试文件的各个方面,但似乎什么都不做,因为它在其系统 return 代码中报告结果。