2017-10-21 14 views
0

あり、私はそうのような端末上で実行することができますプログラムです。./program &C - execを使用してバックグラウンドでプログラムを実行するにはどうすればよいですか?

は、しかし、私はexecvpのを使用して、それをやろうとしているし、それが動作していない:

  pid = fork(); 
      char *argv[3] = {"./program", "&", NULL}; 

      if (pid == 0) { 
       execvp(argv[0], argv); 
      } 
      else{ 
       wait(NULL); 
      } 

私はここで間違って何をしたのですか?

+0

pleseは**編集あなたの質問**それをやる気と本当に何を説明しますやってみたいです。 –

答えて

2

"&""&"は、argv配列にありますが、ここで問題の原因となる可能性があります。これはプログラム引数の場所であり、&はシェルコマンドであり、プログラム引数ではありません。あなたがフォークしてから./programが別のプロセスで実行されるため、削除してください。

+2

私は '&'はシェル*構文*です。それ自体ではコマンドではありません。 –

1

answered by Greg Hewgillとして、&は、job controlに関連するシェル構文です(技術的にはシェルコマンドではありません)。

あなたの質問では、それがなぜ必要なのか不明です。あなたはそれを使用することはできません"&"、あなたのコードが動作するはずです。 background processes、約terminal emulators、約process groupsについても読んでください。 tty demystifiedを読んでください。

ところで、waitの代わりにwaitpid(2)を使用して、pidを指定することができます。 zombie processesを避けるためには、通常、待つ必要があります(たとえば、waitwaitpidwait4(2)など)。 SIGCHLDシグナルを処理することができますが、signal(7) & signal-safety(7)と読んでください。

おそらくdaemon(3)機能を使用します。 setsid(2),setpgrp(2)およびcredentials(7)も参照してください。それ以外の場合は、プログラムの後半でwaitと呼ぶべきでしょう。あなたは、いくつかのpipe(7)に、いくつかの他のopen(2) -edファイルディスクリプタに、/dev/nullにおそらく、(dup2(2)を使用して)リダイレクトしたい場合があります等...、のSTDIN(および/または標準出力stderrを)あなたの子プロセス。 poll(2)を使用して入力または出力を多重化することもできます。

handle the failurefork(2)(-1の場合)、おそらくperror(3)を使用してください。 execvp(3)の障害も処理する必要があります。一部の限られた特定の特定の場合には

、あなたはpopen(3)shnohup(1)batchat、またはbashにしたいことがありますが、一般的にその必要はありません。

(あなたがbackgroundで何かを実行したい理由を、あなたの動機を理解することなく、そして、私たちはより多くのお手伝いをすることはできません)

関連する問題