C com sinais e forks

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
 
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]));
?
 
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:
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.
 
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:
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
 
Back
Topo