为什么这个 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;
}

源代码至少有两个问题:

  1. 您当前目录中不太可能有一个名为 \var\www 的 sub-directory — Ubuntu 使用 / 而不是 \ 用于路径分隔符。

  2. 即使 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 代码中报告结果。