Linux中的setprogname

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

 #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]); 

从关于{set,get}progname 名的* BSD手册页 :

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

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

如上所述,错误和error_at_line函数可以通过定义一个名为error_print_progname的变量来定制。

– 变量:void(*)error_print_progname(void)如果将error_print_progname变量定义为非零值,则指向的函数将由error或error_at_line调用。 预计将打印程序名称或做类似的有用的东西。

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

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

编辑:我只是检查关于{set,get}prognameerror_print_progname的gnulib手册:

在所有非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。

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

试过这个在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 

这对我有用。