3

在 Unix 中,我知道有函数setprognamegetprogname. 两者分别用于设置和获取程序名称。它们可以在图书馆找到stdilib.c。我想知道 Linux 是否也内置了这些功能,因为我无法让它们在 Linux 机器(Ubuntu 10.04)上运行。这些功能可用吗?代码如下,以防我在网上找到的手册页没有讲述整个故事,也没有添加我需要的东西。谢谢!

#define _XOPEN_SOURCE 500

#include<sys/stat.h>
#include<sys/types.h>

#include<errno.h>
#include<fcntl.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>

int main (int argc, char *argv[])
{
    setprogname(argv[0]);
4

3 回答 3

4

*BSD 手册页关于{set,get}progname

getprogname() 和 setprogname() 函数操作当前程序的名称。错误报告例程使用它们来产生一致的输出。

如果您想自定义错误报告的程序名称,error您可以按照 glibc 手册中的说明error_at_line声明和设置error_print_progname变量:

如上所述,可以通过定义名为 error_print_progname 的变量来自定义 error 和 error_at_line 函数。

— 变量:void (*) error_print_progname (void) 如果 error_print_progname 变量定义为非零值,则指向的函数由 error 或 error_at_line 调用。预计会打印程序名称或执行类似有用的操作。

该函数预计将打印到 stderr 流,并且必须能够处理流具有的任何方向。

该变量是全局的并且由所有线程共享。

{set,get}progname编辑:我只是检查了关于和的 gnulib 手册error_print_progname

所有非 glibc 平台都缺少此变量:MacOS X 10.5、FreeBSD 6.0、NetBSD 5.0、OpenBSD 3.8、Minix 3.1.8、AIX 5.1、HP-UX 11、IRIX 6.5、OSF/1 5.1、Solaris 11 2011-11 、Cygwin、mingw、MSVC 9、Interix 3.5、BeOS。

于 2012-09-15T18:13:08.343 回答
3

在 ubuntu 12.04 上试过这个,它可以工作:

安装libbsd-dev软件包。然后尝试编译以下代码:

//filename=somec.c
#include <stdio.h>
#include <bsd/stdlib.h>

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

    if(argc>1)
            setprogname((char*)argv[1]);
    printf("Program name is: %s\n",getprogname());
    return 0;

}

使用这组参数:

gcc somec.c -o somec -lbsd

这对我有用。

于 2013-09-04T03:55:15.883 回答
1

您可以在 GNU/Linux 上使用libbsd从 *BSD 操作系统访问这些和其他有用的实用程序功能。

于 2012-12-29T19:53:16.273 回答