1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

C com sinais e forks

Discussão em 'Programação' iniciada por Neo4, 15 de Junho de 2008. (Respostas: 6; Visualizações: 935)

  1. Neo4

    Neo4 Banido

    Boas,

    estou a fazer uns exercicios para a freq de SO de amanha e tenho aqui uma duvida.

    o exercicio é este:

    Considere um programa filtro que quando invocado com trˆes argumentos: filtro progA progB
    ficheiro processa todo o seu standard input em cadeia atrav´es dos programas progA e progB e
    guarda o resultado em ficheiro. O programa filtro est´a preparado para receber o sinal SIGABRT;
    nessa altura interrompe o processamento escrevendo no ficheiro "INTERROMPIDO", terminando todos
    os processos filho e a sua pr´opria execuc¸ ˜ao.

    este é o meu codigo:
    Código:
    #include <stdio.h>
    #include <sys/wait.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include<readline/readline.h>
    #include<readline/history.h>
    #include<fcntl.h>
    #include<signal.h>
    
    
      void sinal(int x){
    	int fd;
    	fd = open("erro.txt", O_CREAT | O_WRONLY |O_TRUNC, 0644);
    	write(fd,"INTERROMPIDO.\n",strlen("INTERROMPIDO.\n"));
    	printf("erro!\n");
    	exit(0);
      }
    	
      main(int argc, char **argv){
    	int i, p[2], fd, t, fk;
    	char buff[1000];
    	signal(SIGABRT, sinal);
    
    
    	for(i=1; i<argc-1; i++){
    		pipe(p);
    		fk = fork();	
    		if(!fk){
    			dup2(p[1], 1);
    			close(p[1]); close(p[0]);
    			execvp(argv[i], NULL);
    			exit(-1);
    		}
    		dup2(p[0],0);
    		close(p[1]);
    		close(p[0]);	//kill(fk, SIGABRT);
    	}
    
    	fd = open(argv[argc-1], O_CREAT | O_WRONLY |O_TRUNC, 0644);
    	while(t = read(0, buff, 1000)){
    		write(fd, buff, t);
    	}
    	close(fd);
    
    	wait(0);
      }
    o meu problema prende-se em como passar o nome do ficheiro que recebe em argv para a funcao sinal para abrir esse e nao o erro.txt que fiz so para testar se tudo trabalhava bem...

    obrigado
     
  2. Baderous

    Baderous Banido

    Será algo do género:

    Código:
    void sinal(char *str) {
        int fd;
        fd = open(str,O_CREAT | O_WRONLY |O_TRUNC, 0644);
    
    (...)
    
      main(int argc, char **argv){
        int i, p[2], fd, t, fk;
        char buff[1000];
        signal(SIGABRT,sinal(argv[indice_do_nome_do_ficheiro]));
    ?
     
  3. Neo4

    Neo4 Banido

    a funçao sinal so recebe um int! nao é possível enviar argumentos que eu saiba.

    se conseguires por isso a dar com a tua soluçao avisa ,mas pelo que sei duvido.
     
    Última edição: 15 de Junho de 2008
  4. Baderous

    Baderous Banido

    Quando fazes: signal(SIGABRT,sinal); suponho, que sinal seja a função que tu definiste. Se for, então não estás a invocá-la com nenhum parâmetro (tal como definiste no seu header, o tal int x). Se és tu que defines, então podes fazer como eu disse, desde que a definas correctamente.
     
  5. Neo4

    Neo4 Banido

    ali onde eu diss signal era sinal.

    nao podes nada! a funcao sinal é o handler do signal é definida assim.
    faz man signal na consola e ve la!

    eu ja te disse vai estudar SO :D

    e ja agora testa as tuas teorias antes de postares!
     
    Última edição: 15 de Junho de 2008
  6. countzero

    countzero Power Member

    Código:
    --- fork.orig.c 2008-06-15 22:43:09.000000000 +0100
    +++ fork.c      2008-06-15 22:43:31.000000000 +0100
    @@ -7,11 +7,10 @@
     #include<fcntl.h>
     #include<signal.h>
    
    +static int fd;
    
     void sinal(int x)
     {
    -       int fd;
    -       fd = open("erro.txt", O_CREAT | O_WRONLY | O_TRUNC, 0644);
            write(fd, "INTERROMPIDO.\n", strlen("INTERROMPIDO.\n"));
            printf("erro!\n");
            exit(0);
    @@ -19,7 +18,7 @@
    
     main(int argc, char **argv)
     {
    -       int i, p[2], fd, t, fk;
    +       int i, p[2], t, fk;
            char buff[1000];
            signal(SIGABRT, sinal);
    
    Olá, não sei se já resolveste o problema ou não.

    Uma ideia é definir fd como variável global no ficheiro, inicializas o fd na main e estará automaticamente disponível na função sinal.

    Cumps,
    JP
     
  7. Neo4

    Neo4 Banido

    sim resolvi e foi dessa maneira mesmo =)

    obrigado! :D
     

Partilhar esta Página