2

私のプロジェクトでは、親タスクと並行して再生するサブタスクが必要です。fork() を使用して、並列プロセスを作成しますaplay xyz.wav。親プロセスから子プロセスを強制終了したい場合、たとえばsystem("kill -9 aplay ")aplay が強制終了されますが、親タスクの 2 つのインスタンスが表示されます。1 つは fork() の呼び出しによって作成されたコピーで、もう 1 つはオリジナルだと思います。また、fork() を呼び出すたびに、コピーの数が増えます。メモリオーバーフローを意識しています。元のプロセスを維持したいだけです。その親コピーを強制終了しようとしましたが、失敗しました!親プロセスのコピーが「無効」と表示されます。

aplayを強制終了するかどうかに関係なく、並列プロセスを呼び出すと、「無効」プロセスが増加し続けます。また、PID で defunt を強制終了しようとしましたが、これも機能しませんでした。

static int
 test(Core *pc, char *args)
{


pid1=fork();
if (pid1 ==0)
{  
        system ("ps " );
       system("aplay /opt/Line_Tone_14s.wav");

      _exit(0);
}
else if(pid1<0)
{
 out("fork() ERROR (-1) returned\n");
}
else if(pid1>0)
{
 out("I AM IN PARENT PROCESS() NOW\n");
 }
return 1;

 }

static int
test1(Core *pc, char *args)
{ 
 system ("ps " );
system ("killall -9 aplay "); 
return 1;

}

    Initially 

> PID TTY          TIME CMD
1580 pts/0    00:00:00 sudo
1581 pts/0    00:00:00 su
1589 pts/0    00:00:00 bash
5732 pts/0    00:00:00 parent
5738 pts/0    00:00:00 sh
5739 pts/0    00:00:00 ps

>test
> PID TTY          TIME CMD
1580 pts/0    00:00:00 sudo
1581 pts/0    00:00:00 su
1589 pts/0    00:00:00 bash
5732 pts/0    00:00:00 parent
5737 pts/0    00:00:00 parent
5740 pts/0    00:00:00 sh
5741 pts/0    00:00:00 aplay
5743 pts/0    00:00:00 sh
5744 pts/0    00:00:00 ps


>test1                  
>killed

after kill
>PID TTY          TIME CMD
1580 pts/0    00:00:00 sudo
1581 pts/0    00:00:00 su
1589 pts/0    00:00:00 bash
5732 pts/0    00:00:00 parent
5737 pts/0    00:00:00 parent <defunct>
5753 pts/0    00:00:00 sh
5754 pts/0    00:00:00 ps

>test
> PID TTY          TIME CMD
1580 pts/0    00:00:00 sudo
1581 pts/0    00:00:00 su
1589 pts/0    00:00:00 bash
5732 pts/0    00:00:00 parent
5737 pts/0    00:00:00 parent <defunct>
5759 pts/0    00:00:00 parent
5762 pts/0    00:00:00 sh
5763 pts/0    00:00:00 aplay
5765 pts/0    00:00:00 sh
5766 pts/0    00:00:00 ps

>test1
>killed

after kill

>PID TTY          TIME CMD
 1580 pts/0    00:00:00 sudo
1581 pts/0    00:00:00 su
1589 pts/0    00:00:00 bash
 5732 pts/0    00:00:00 parent
5737 pts/0    00:00:00 parent <defunct>
5759 pts/0    00:00:00 parent <defunct>
5773 pts/0    00:00:00 sh
5774 pts/0    00:00:00 ps

私も test() コマンドでこれを試しました

else if(pid1>0)
 {
  out("I AM IN PARENT PROCESS() NOW\n");
 wait(&status);
 }

これを行うと、「テスト」コマンドを何度呼び出しても、aplay がサウンドの再生を終了した後、1 つの親プロセスだけが残ります。しかし、これに関する問題は、サウンドの再生中に、終了するまで他のコマンドを入力できないことです。そのため、サウンドの再生中にそれを殺すことができませんでした。

並行してサウンドを再生したい、いつでも好きなときに殺したい。

4

1 に答える 1

6

そのようにそれを殺すな !に子 PID があります。関数をpid1使用してそれを強制終了します。kill()

実行する別のプロセスを生成することkillallは不要であり、費用がかかり、(ご存知のように) 信頼性が高くありません。その実行可能ファイルのコピーが5 つ実行されている場合はどうなるでしょうか。

次のようなものを使用できます。

#include <sys/types.h>
#include <signal.h>
:
int rc = kill (pid1, 9);  // or SIGKILL for portability, rather than 9.
// Check rc and errno.

あなたの親で。

systemまた、別のプロセスを起動するため、子プロセスの呼び出しも削除することを真剣に検討します。exec呼び出しのファミリーを使用して、子のプロセス空間でプログラムを置き換えることで、より良い結果を得ることができます。

于 2012-09-05T07:07:34.590 に答える