【问题标题】:SIGKILL won't work to stop child process after child signals completion子进程完成后,SIGKILL 将无法停止子进程
【发布时间】:2024-01-05 01:01:01
【问题描述】:

我的程序创建 n 个子进程,每个子进程计数(+5)如果超过 100,它会向父进程发送信号,父进程应该杀死这个子进程。 我做了这个程序,但它不起作用,它一直在计算第一个孩子,这意味着 SIGKILL 不起作用。

#include<stdio.h>
#include<stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <signal.h>


pid_t pids[10];
int pidval[10];
int l;

void handler1(int mysignal)
{
    int i;
    for (i=0; i<l; i++) {
        if (pidval[i]>100) {
            kill(pids[i], SIGKILL);
            printf("\n killed ");
        }
    }
}

int main(int argc, char ** argv)
{

    int i, s;
    l = atoi(argv[1]);
    pid_t pid;
    for(i=0; i<l; i++)
    {
        pid=fork();

        if(pid<0) 
            printf("\n error \n");
        if (pid==0) {
            pids[i] = getpid();
            while(1) {
                s+=5; 
                if(s>100) 
                {
                    pidval[i]=s;
                    printf("\noverflow,%d,%d,%d",s,pids[i],getpid());
                    kill(getppid(), SIGALRM);
                };
            }
        }
        if(pid>0) {
            signa(SIGALRM,handler1);
            waitpid(-1,NULL,0);
        }
    }
}

【问题讨论】:

  • 你的老师有没有告诉你正确的代码格式?
  • 分叉的进程不共享相同的变量!子进程获得父进程堆栈/全局空间的副本,但是其他进程看不到对它们所做的任何更改。如果您想正确共享您的数据,您需要明确地这样做。
  • 所以我可以让所有进程共享一个文件 txt 来代替数组?

标签: c linux process fork sigkill


【解决方案1】:

使用 SIGTERM,看看这个article

【讨论】:

    【解决方案2】:

    谢谢你的建议

    #include<stdio.h>
    #include<stdlib.h>
    #include <sys/types.h>
    #include <unistd.h>
    #include <signal.h>
    
    
    
    
    void handler1(int mysignal)
    {   
    FILE *pids = NULL;
    FILE *pidvals=NULL;
    int pid1,pid2,val,sum;
        pids=fopen("pids.txt","r");
    
    
        while(fscanf(pids,"pid = %d\n",&pid1)!=EOF)
        {   pidvals=fopen("vals.txt","r");
            while((fscanf(pidvals,"pid = %d val = %d\n",&pid2,&val)!=EOF))
            {
                if(pid1==pid2)
                sum+=val;
            }
            fclose(pidvals);
                if(sum>100) kill(pid1,SIGTERM);
    
        }
        fclose(pids);
    
    }   
    
    
    
    int main(int argc, char ** argv)
    {   FILE *pids = NULL;
    FILE *pidvals=NULL;
    
        int i, s;
        int l=atoi(argv[1]);
        pid_t pid;
    
        for(i=0;i<l;i++)
        {
          pid=fork();
    
          if(pid<0) printf("\n error \n");
          if (pid==0) {pids=fopen("pids.txt","a");
                   fprintf(pids,"pid = %d\n",getpid());
                   fclose(pids);
               s=0;
                       while(1){
    
                    s+=5;
                    pids=fopen("vals.txt","a");
                    fprintf(pids,"pid = %d val = %d\n",getpid(),s);
                    fclose(pids); 
                               if(s>100) 
                                  {
                                   printf(" \nsend signal\n");
                                   kill(getppid(),SIGALRM);};
                                   }
                      }
          if(pid>0) {
                      signal(SIGALRM,handler1);waitpid(-1,NULL,0);
                    }
      }
    
    
    
    }
    

    【讨论】: