2014-01-20 24 views
1

我的程序創建一個子進程,每個子進程數(+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); 
       } 
    } 



}