3

setprognameUnix では、関数とがあることを知っていますgetprogname。どちらも、それぞれプログラム名を設定および取得するためのものです。それらは図書館にありますstdilib.c。Linuxマシン(Ubuntu 10.04)で実行できないため、Linuxにもこれらの機能が組み込まれているのではないかと思っていました。これらの機能は利用できますか? 私がオンラインで見つけた man ページが全体の話を伝えておらず、必要なものを追加しなかった場合のコードを以下に示します。ありがとう!

#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 および error_at_line 関数は、error_print_progname という名前の変数を定義することによってカスタマイズできます。

— 変数: void (*) error_print_progname (void) error_print_progname 変数がゼロ以外の値に定義されている場合、指す関数は error または error_at_line によって呼び出されます。プログラム名を出力するか、同様の有用なことを行うことが期待されています。

この関数は、stderr ストリームに出力されることが期待されており、ストリームの向きを処理できる必要があります。

変数はグローバルで、すべてのスレッドで共有されます。

編集: gnulib のマニュアルをチェックして、{set,get}prognameerror_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 に答える