fork()并在linux中杀死

时间:2012-09-05 07:02:10

标签: c linux parallel-processing fork kill-process

在我的项目中,我需要一个与父任务并行的子任务。我使用fork()创建一个aplay xyz.wav的并行进程。现在,当我想从父进程中杀死子进程时,例如system("kill -9 aplay "),aplay被终止,但我看到了父任务的两个实例。我认为其中一个是通过调用fork()创建的副本,另一个是原始版本。并且每次fork()调用时,副本数量都会增加。我意识到内存溢出。我只想保留原始流程。我试图杀死那个父副本但是失败了!父进程的副本显示为'defunct'。

'defucnt'进程继续增加,因为我称之为并行进程,无论我是否杀死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);
 }

通过这样做,无论我多少次调用“test”命令,在播放结束播放声音后只剩下一个父进程。但问题是,在声音播放期间我无法输入任何其他命令,直到它完成。所以无法在播放声音之间杀死它。

我想平行播放声音,想要随时杀死我想要的声音。

1 个答案:

答案 0 :(得分:5)

不要那样杀了!您在pid1中拥有子PID,只需使用kill()函数将其删除。

产生一个单独的进程来运行killall是不必要的,昂贵的(正如你所发现的那样),而不是那么可靠。如果该可执行文件的五个副本正在运行,该怎么办?

您可以使用以下内容:

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

在你父母身上。

我还要认真考虑删除子进程中的system调用,因为它们启动了单独的进程。您可以使用{em>替换子进程空间中的程序exec系列调用来做得更好。