我知道这听起来可能有点奇怪,但我正在试图找出当向主程序传递错误参数时何时会出现这种类型的错误。
假设我有一个接受1或2个参数的程序。如果是2个参数,则只能是:

argv[0] =./programName


argv[1] = "-A".

除“-A”之外的任何其他argv[1]都需要打印“2没有此类文件或目录”消息。
据我所知,这是一条系统消息,所以打印它对我不起作用。
是否需要将所有可能的主参数保存在文件中,然后将键入的参数与文件中的参数进行比较?
现在我的方式是:
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <fcntl.h>
#include <stdlib.h>
#include <time.h>
#include <errno.h>
#include <sys/stat.h>
#include <sys/times.h>
#include <sys/wait.h>

int main (int argc, char *argv[]){
.....
...

if (argc == 2 && strcmp(argv[1], ARGV_2)!=0){
return(EXIT_FAILURE);
}

...
.....
}

最佳答案

我认为ls是通过error()函数实现的:
GNU Error_messages
函数:void error(int status,int errnum,const char*format,…)
初步:| MT Safe locale |作为不安全损坏堆i18n | AC Safe
|参见POSIX安全概念。
错误函数可用于报告
程序执行。format参数是一个格式字符串,就像
给printf函数族的那些函数。所需的参数
因为格式可以跟在格式参数后面。就像佩罗一样,
错误也可以以文本形式报告错误代码。但不像佩罗
错误值显式传递给errnum中的函数
参数。这消除了上面提到的错误
必须在函数之后立即调用报表函数
导致错误,否则errno可能有不同的值。
错误首先打印程序名。如果应用程序定义了
全局变量error_print_progname并将其指向一个函数
函数将被调用以打印程序名。否则
使用全局变量程序名中的字符串。程序名
后跟冒号和空格,然后是
由格式字符串生成的输出如果errnum参数是
非零格式字符串输出后跟冒号和空格,
后跟错误代码errnum的错误消息。无论如何
是以换行符结尾的输出。
输出被定向到stderr流。如果斯特德没有
先定位后调用将是狭义的。
函数将返回,除非status参数具有非零
价值。在这种情况下,函数将用状态值调用出口。
因为它的参数,所以永远不会返回。如果返回错误,则
全局变量error_message_count递增1以保持
跟踪报告的错误数。
所以也许这样的事情可以达到OP的目标,以及之前建议的其他答案:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <error.h>

int main(int argc, char* argv[])
{
    if (argc == 2 && strcmp(argv[1], "-A") != 0) {
        error(ENOENT, ENOENT, "cannot access %s", argv[1]);
    }

    printf("program didn't get to here\n");
}

ls的输出和此示例:
~/workspace/tests/ $ ./ctest bogus_dir
./ctest: cannot access bogus_dir: No such file or directory
~/workspace/tests/ $ ls bogus_dir
ls: cannot access bogus_dir: No such file or directory

10-01 19:22