0

標準入力から読み取ったバイト数を決定する C プログラムを作成しています。プログラムに入力を与える方法があることを知りました

  • パイプ入力
  • リダイレクション
  • プログラムが入力を待っている間にコマンドラインに入る

シェルからプログラムが実行された正確なコマンドを見つける方法。コマンドライン引数を使用しようとしましたが、失敗しました。

#include <stdio.h>

int main(int argc,char *argv[])
{
        char buffer[100];
        int n;

        for(n=1;n<argc;n++)
                printf("argument: %s\t",argv[n]);

        printf("\n");
        if(argc==1)
                printf("waiting for input :");
        else if (argc==3)
                printf("Not waiting for input . Got the source from command itself .");

        n = read(0,buffer,100);
        if(n==-1)
                printf("\nError occured in reading");
        printf("\nReading successfully done\n");

        return 0;
}

また 、

4

2 に答える 2

1

一般に、プログラム内からこれを行うことはできません。シェルはこれらの引数の一部を渡さない可能性があります。プログラムが実行されたり引数を取得したりする前に、グロブが展開され、I/O リダイレクトが行われます。

に電話してみps -o argsてください。うまくいくかもしれません。ただし、私が知る限り、リダイレクトはしません。

于 2013-10-19T03:28:49.480 に答える
0

いくつかのオプションがあります。argv をチェックして、それがどのように呼び出されたかを確認します (argv[0] は、完全パス、相対パス、現在のディレクトリとして呼び出されたか、前の /s .s またはその欠如に基づいて $PATH を使用して呼び出されたかを示します)

次のような方法で、それを呼び出した親プロセスを取得できます。

sprintf(buf,"/proc/%d/cmdline",getppid());
fd=open(buf,O_RDONLY);
read(fd,buf,buf_size);
write(1,buf,strlen(buf));

上記のように getpid を使用して現在のコマンドの /proc/pid/... から他の情報を取得することもできます (getppid ではありません)。

親プロセスを取得すると、さらにアクションを実行できる場合があります。たとえば、親のベース名が sh または bash の場合、履歴ファイルを開いて読み取り、アプリの出現箇所を見つけることができます。それを呼び出した完全なコマンドが表示されます。他のアプリケーションにも同様の履歴ファイルがある場合があります。

于 2013-10-19T03:49:38.030 に答える