如何只终止子进程?

时间:2017-09-06 14:09:07

标签: c fork

我希望使用pidburst time打印一系列流程。为此,我使用pid生成fork(),然后使用pid获取getpid()。但是,由于fork创建了一个与父进程隔离运行的子进程,因此我没有得到预期的行为。程序应该做的是为给定的number_of_process生成进程,然后在特定的结构元素中存储pid和随机burst time值。这是我的代码: -

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<signal.h>

struct process{
    int pid;
    int bt;
};

int main()
{   
    int no_of_process,i,new_process;
    printf("Enter the number of process\n");
    scanf("%d",&no_of_process);
    struct process p[no_of_process];
    for(i=0;i<no_of_process;i++){
        new_process=fork();
        p[i].pid = getpid();
        p[i].bt = rand()%10;
        //kill(getpid(),SIGKILL);
    }
    for(i=0;i<no_of_process;i++){
        printf("process %d and bt %d\n",p[i].pid,p[i].bt);
    }
    return 0;
}

我试图杀死子进程,但这会停止整个程序。 进程数的输出= 2

process 6373 and bt 3
process 6373 and bt 6
process 6374 and bt 3                                                           
process 6376 and bt 6
process 6373 and bt 3
process 6375 and bt 6
process 6374 and bt 3
process 6374 and bt 6

预计应该只有2个具有pid和bt(突发时间)的进程。

  
      
  • 如何在存储pid和bt(突发时间)之后杀死子进程,或者无法完成?
  •   

3 个答案:

答案 0 :(得分:6)

您根本没有正确使用fork。当您调用它时,子进程继续执行与父进程相同的代码,但获取不同的返回值(0)以指示它是子进程。所以在你的代码中,子进程都会产生自己的子进程。

使用fork的常用方法是做类似

的操作
new_process=fork();
if(new_process==0)
  {
  // I am the child
  }
else if(new_process==-1)
  {
  // Something bad happened
  }
else
  {
  // I am the parent
  }

答案 1 :(得分:3)

您需要注意fork的返回值。对您的代码进行这种小修改可能会完成您正在寻找的内容。

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<signal.h>

struct process{
    int pid;
    int bt;
};

int main()
{   
    int no_of_process,i,new_process;
    printf("Enter the number of process\n");
    scanf("%d",&no_of_process);
    struct process p[no_of_process];
    for(i=0;i<no_of_process;i++){
        new_process=fork();
        if (new_process == 0) {
            // This is a child process. Just spin until killed.
            while(true);
        }
        p[i].pid = new_process;
        p[i].bt = rand()%10;
        kill(new_process,SIGKILL);
    }
    for(i=0;i<no_of_process;i++){
        printf("process %d and bt %d\n",p[i].pid,p[i].bt);
    }
    return 0;
}

答案 2 :(得分:2)

在您的代码中,new_process为0(因此它是孩子)或者它是孩子的​​pid - 无需调用getpid(忽略-1)失败)

所以,在父(0返回值)中调用fork no_of_processes