LINUX.ORG.RU

Сигналы.


0

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

int mes1,mes2;
FILE *klop;

void signal_handler(int sig)
{
	switch(sig)
	{
	
	case SIGHUP: 
	   
	  fprintf(klop,"1 ");
	  break;
	
	case SIGTERM:
	  
	  printf("zapisalos\n");
	  _exit(0);
	  break;
	    
	}
}


void main()
{
	int i,j;
	
	pid_t pid;
	fflush(NULL);
	signal(SIGTERM,signal_handler);
	signal(SIGHUP ,signal_handler);

	signal(SIGSEGV,signal_handler);
	klop=fopen("2.txt","ab");
	pid=fork();
	

	switch( pid)
	{
		case -1 : 
		  printf("no creat");
		  _exit(1);

	
		case 0 : //потомок
	
		    printf("children\n");		  
		    break;
		
		

		default : //родитель
		  {	
		    for (i = 0;i<5 ;i++)
		  {
		 
		     //kill(pid,SIGSEGV);
		    kill(pid,SIGHUP);
		     sleep(1);
		    
		  }
		printf("ubili children\n");
	
		kill(pid,SIGTERM);
		  }
		fclose(klop);
	        klop=fopen("2.txt","r");
		
		while(!feof(klop))
		  {
		    fscanf(klop,"%d ",&i);
		    printf("%d ",i);
		  };
		printf("\n");
	}
		
	}

Подскажите , почему дочерний процесс то уничтожается?

А почему у тебя пид -1 и 0?

wlan ★★
()

У вас race condition в коде. Дочерний процесс после printf() сразу прекращает выполнение и становится зомбарем. Родительский процесс может успеть в него выстрелить одним сигналом до sleep(), а может и не успеть. Подвешивайте дочерний процесс.

PS: После default не нужны скобки блока. PPS: Muh eyes.

elfy
()
Ответ на: комментарий от elfy
#include<stdio.h>
#include <signal.h>
#include <unistd.h>
#include <sys/types.h>
#include <string.h>

int mes1,mes2,status;
FILE *klop;

void signal_handler(int sig)
{
	switch(sig)
	{
	case SIGUSR1:
	  
        printf("tralalal \n");
        sleep(1); ///////////////////////////// задерживаем )
	  
	  break;
	
	case SIGTERM:
	  
	  printf("zapisalos\n");
	  exit(0);
	  break;

	}
}


void main()
{
	int i,j;
	pid_t pid;
	fflush(NULL);
signal(SIGCHLD, SIG_IGN);
	signal(SIGTERM,signal_handler);
	signal(SIGHUP ,signal_handler);

	signal(SIGUSR1,signal_handler);
	klop=fopen("2.txt","ab");
	pid=fork();
	

	switch( pid)
	{
		case -1 : 
		  printf("no creat");
		  _exit(1);
		  //break;
	
		case 0 : //потомок
		  	  
		    break;
		
		

		default : //родитель

		    for (i = 0;i<10 ;i++)
		  {

		 
		     kill(pid,SIGUSR1);

		     printf("%d\n", i);
		     sleep(1);

		  }
		printf("ubili children\n");

		kill(pid,SIGTERM);
		  

		printf("asd \n");
     		fclose(klop);
	
	klop=fopen("2.txt","r");
		
		while(!feof(klop))
		  {
		    fscanf(klop,"%d ",&i);
		    printf("%d ",i);
		  };
		printf("\n");
	}

		
	}

поставил sleep(1) в обработчике сигнала и вроде как заработало.

druidich
() автор топика

void main()

убей себя

anonymous
()

Ты сам его убил

Dron ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.