1

次のcコードがあります。呼び出してファイルを少なく表示したいのですexecv() が、次のようには機能しないようです。プログラムが終了し、通知が飛び出します。

#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
int main(void){
  int pid; 
  if(pid=fork()>0){
      //read in from stdin and pass to pipe
   }else if(pid==0){
      //read from pipe
      //write to out.txt
      //everything up to here works fine

      char* para[]={"less","/Desktop/out.txt"};
      execv("/bin/less",para);
   }
   return 0;
}
4

2 に答える 2

1

execv("bin/less", para);(元のコードに/は. これは、プログラムがであり、 ではないことを前提としています。を使用して、プログラムの PATH ベースの検索を行うことさえできます。less./bin/less/bin/less/usr/bin/lessexecvp()

もう 1 つ問題があります。引数リストの末尾を示すために null ポインターを含める必要があります。

最後に、execv()返品後にエラー メッセージを出力できます。返されたという事実だけで、失敗したことがわかります。

#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>

int main(void)
{
    int pid;
    if ((pid = fork()) != 0)
    {
        // read in from stdin and pass to pipe
        // Need to test for fork() error here too
    }
    else
    {
        // read from pipe
        // write to out.txt
        // everything up to here works fine

        char *para[] = { "/bin/less", "Desktop/out.txt", 0 };
        execv(para[0], para);
        fprintf(stderr, "Failed to execute %s\n", para[0]);
        exit(1);
    }
    return 0;
}

または:

        char *para[] = { "less", "Desktop/out.txt", 0 };
        execvp(para[0], para);
        fprintf(stderr, "Failed to execute %s\n", para[0]);

コメント以外にパイプの兆候がないため、パイプに関するコード内のコメントは不可解です。現状では、less読み取るように指示されたファイルを読み取ります。less出力が端末に送信されない場合、出力はページ分割されないことに注意してください。lessI/O リダイレクトが見られないので、プログラムが書き込もうとするものはすべて無視され、プログラムにデータが返されないと仮定する必要があります。

于 2012-05-26T06:03:14.083 に答える
1
char* para[]={"less","/Desktop/out.txt"};
execv("/bin/less",para);

execv は、パラメーターの読み取りをいつ停止するかをどのように認識しますか?

エラーを返す execv() を処理するコードをそこに入れていれば、これが見つかると思います。fork() からのエラーもテストしていません。

于 2012-05-26T06:04:22.043 に答える