2014-01-20 3 views
1

моя программа создает n дочерний процесс, каждый дочерний счетчик (+5), если он превосходит 100, он посылает сигнал родителям, родитель должен убить этого ребенка Я сделал программу, но она не будет работать, это продолжает подсчет в первом ребенке, что означает, что SIGKILL не помог здесь?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); 
     } 
    } 
} 
+1

ли ваш учитель рассказать вам о правильном форматировании кода? – Devolus

+0

лучше? @Devolus –

+3

Прошитые процессы не имеют одинаковых переменных! Ребенок получает _copy_ стека/глобального пространства родителя, однако любые изменения, внесенные в них, не рассматриваются другим процессом (процессами). Если вы хотите правильно использовать свои данные, вам необходимо явно это сделать. – mah

ответ

0

Я сделал это спасибо за ваши советы

#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); 
       } 
    } 



} 
Смежные вопросы