View Full Version : C com sinais e forks


Neo4
15-06-2008, 18:47
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:
#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

Baderous
15-06-2008, 18:58
Será algo do género:

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]));?

Neo4
15-06-2008, 19:06
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.

Baderous
15-06-2008, 19:17
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.

Neo4
15-06-2008, 19:57
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!

countzero
15-06-2008, 23:45
--- 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

Neo4
15-06-2008, 23:46
sim resolvi e foi dessa maneira mesmo =)

obrigado! :D