Carlos7 Posted February 18, 2013 at 03:30 PM Report #495973 Posted February 18, 2013 at 03:30 PM Boas, tenho um exercício de exame em c que tem que gravar um determinado número escolhido por mim para um ficheiro ao carregar ctrl + c. Mas por defeito, ao carregar ctrl + c num programa a ser corrido na linha de comandos, a execução do programa é encerrada. Alguém pode dar ideia de como fazer? O programa tem obrigatoriamente de ser executado em linha de comandos linux.
HappyHippyHippo Posted February 18, 2013 at 03:39 PM Report #495975 Posted February 18, 2013 at 03:39 PM como estás completamente a leste, o melhor é começar pelo início: http://en.wikipedia.org/wiki/Unix_signal depois é a sua implementação: http://pubs.opengroup.org/onlinepubs/7908799/xsh/sigaction.html IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
Carlos7 Posted February 18, 2013 at 03:42 PM Author Report #495976 Posted February 18, 2013 at 03:42 PM Eu já dei sinais apesar de não perceber ainda muito bem a matéria, o que tenho de fazer é ao terminar o programa enviar um sinal ao processo pai para que escreva no ficheiro?
HappyHippyHippo Posted February 18, 2013 at 04:05 PM Report #495985 Posted February 18, 2013 at 04:05 PM já leste a documentação apresentada ? IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
Carlos7 Posted February 18, 2013 at 04:49 PM Author Report #496002 Posted February 18, 2013 at 04:49 PM Sim mas ainda não tenho bem ideia de como fazer. Tou mesmo burro hoje...
Carlos7 Posted February 19, 2013 at 03:07 PM Author Report #496156 Posted February 19, 2013 at 03:07 PM Continuo sem conseguir fazer o pretendido... Como é que eu consigo enviar um sinal para fazer escrita para um ficheiro?
HappyHippyHippo Posted February 19, 2013 at 03:17 PM Report #496160 Posted February 19, 2013 at 03:17 PM verifica o que este exemplo faz : #include <signal.h> #include <stdio.h> #include <stdlib.h> void termination_handler(int signum) { static int i = 3; if (i) { printf("i = %d\n", i); i--; } else exit(0); } int main() { struct sigaction action; action.sa_handler = termination_handler; sigemptyset(&action.sa_mask); action.sa_flags = 0; sigaction(SIGINT, &action, NULL); while (1) /* void */; return 0; } IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
Carlos7 Posted February 20, 2013 at 02:37 PM Author Report #496287 Posted February 20, 2013 at 02:37 PM Fica a espera de qualquer coisa ... Pelo menos penso eu que seja por causa daquele while(1). Estou errado?
HappyHippyHippo Posted February 20, 2013 at 03:20 PM Report #496295 Posted February 20, 2013 at 03:20 PM mas experimentaste fazer o Ctrl+C ? IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
Carlos7 Posted February 20, 2013 at 03:28 PM Author Report #496296 Posted February 20, 2013 at 03:28 PM (edited) Sim experimentei e não faz nada (não termina a execução) mas faz o que diz na função em cima descrita. Edited February 20, 2013 at 03:34 PM by Carlos7
HappyHippyHippo Posted February 20, 2013 at 03:34 PM Report #496297 Posted February 20, 2013 at 03:34 PM não te aparece uma mensagem quando carrecas no Ctrl+C ??? se sim continua a carregar ... IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
Rui Carlos Posted February 20, 2013 at 03:35 PM Report #496298 Posted February 20, 2013 at 03:35 PM E não te mostra nada no ecrã? De qualquer modo, ao quarto Ctrl+C devia encerrar o programa. Rui Carlos Gonçalves
Carlos7 Posted February 20, 2013 at 03:36 PM Author Report #496299 Posted February 20, 2013 at 03:36 PM (edited) Sim ele mostra o printf da função em cima do main, e ao quarto crt+c encerra o programa. Era isso que eu queria dizer, expliquei-me mal, só ainda não percebi muito bem o funcionamento. Porque nunca usei essas estruturas nas aulas Edited February 20, 2013 at 03:37 PM by Carlos7
Rui Carlos Posted February 20, 2013 at 04:06 PM Report #496300 Posted February 20, 2013 at 04:06 PM Também nunca usei essa estrutura (ainda sou do tempo do signal), mas não foi difícil perceber o seu funcionamento. Aquilo que tu precisas é simples: alterar a função que é executada quando o sinal é enviado. É isso que é feito nas primeiras 5 linhas de código da função main que te foi apresentada. Depois, é estudar minimamente a documentação, para perceberes como podes modificar o código para o teu caso. (Para isso está basta pensar onde é que está definido o comportamento da função que é executada quando carregas no Ctrl+C, e mudar o código aí.) Rui Carlos Gonçalves
HappyHippyHippo Posted February 20, 2013 at 04:09 PM Report #496301 Posted February 20, 2013 at 04:09 PM epa ... o exemplo é simples, o que não percebeste ? IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
Carlos7 Posted February 20, 2013 at 04:26 PM Author Report #496303 Posted February 20, 2013 at 04:26 PM Sim o exemplo é simples mas como o Rui Carlos referiu, eu também aprendi com o signal ( xxxxx, yyyy). Ou seja como não conheço a estrutura que utilizas-te, não sei o que cada linha faz.
HappyHippyHippo Posted February 20, 2013 at 04:47 PM Report #496307 Posted February 20, 2013 at 04:47 PM http://linux.die.net/man/2/signal The behavior of signal() varies across UNIX versions, and has also varied historically across different versions of Linux. Avoid its use: use sigaction(2) instead. See Portability below. agora, explicar o que cada coisa faz é irrelevante porque foi tudo iniciado sem informação tirando o parâmetro que guarda o ponteiro para a função a ser executada IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now