私のプロジェクトでは、親タスクと並行して再生するサブタスクが必要です。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 つの親プロセスだけが残ります。しかし、これに関する問題は、サウンドの再生中に、終了するまで他のコマンドを入力できないことです。そのため、サウンドの再生中にそれを殺すことができませんでした。
並行してサウンドを再生したい、いつでも好きなときに殺したい。