1

ls&ユーザーが何かを入力しているかどうかを確認したいので、シェルでバックグラウンドジョブls &を設定できるようになります。bg_flagただし、次のコードは に対してチェックできませんls&&ls&&ユーザーが入力した場合、または最後に複数のものが含まれている場合、バックグラウンドジョブと見なされたくないためです(Linuxシェルでも同じかどうかはわかりません)&

  if (strstr(args[arg_count-1],"&")!=NULL)
  //if (strcmp(args[arg_count-1],"&")==0)
              {
                bg_flag=1;
                printf("I am a background job %d ",getpid());
              }

これを修正するための適切な方法を教えてください。

4

1 に答える 1

4

これを確実に行うには、シェルが行うのと同じ方法でコマンドを適切に解析する必要があります。通常、そのための文法を定義し、パーサー ジェネレーターを使用します。それ以外はすべて推測であり、ほとんどの場合失敗します。

たとえば、次のように考えてください。

some_program \&&

2 つのアンパサンド ( &&) で終了しますが、最初のアンパサンドがエスケープされているため ( )、とにかくバックグラウンド プロセスになります\&

ただし、接尾辞\&&を「背景」としてマークすることも正しくありません。

some_program \\&&

バックグラウンド プロセスではありません (代わりに、不完全なコマンドです)。

また、適切な文法を定義しない限り、私の 2 つの例が示すように、すべてを正しく把握できない可能性が非常に高くなります。

もう 1 つの種類の問題は、端末から自分自身を切り離すプログラム (デーモン化と呼ばれることもあります) である可能性があります。それらはシェルによってバックグラウンド化されるのではなく、自分自身で同じことを行います。

于 2013-09-29T00:27:47.053 に答える