1. Executa 02 chamadas de sistema: getpid(..), getppid(..). Ambas retornam o identificador do processo corrente e o identificador do processo que gerou o processo corrente, ou seja, processo pai.
/* hll-wrld.c - imprime "Hellow World" */ /* **************************************** Includes */ #include/* ************************************************** Main Program */ int main( int argc, char* argv[] ) { printf("Processo \"Hello World\" - Pid: %d \n", getpid()); printf("Processo PAI \"bash\" - Pid: %d \n", getppid()); exit(0); }
2. Constroi uma arvore "genealogica" de processos invocando a chamada fork(..) em um laco por 03 vezes. Mas depois do primeiro laco, tanto o processo que gerou o primeiro filho quanto o processo filho estao aptos a gerar descendentes. O mesmo raciocinio deve ser feito para o 3o laco e, neste caso, 04 processos irao gerar descendentes. Dentre eles, teremos o 1o processo, seus filhos, filhos de seus filhos e filhos de filhos de seus filhos.
/* fmly-prc.c - utiliza as chamadas fork(), getpid(), wait(). */ #include#include #include void create_process( void ) { int pid; printf(" Pid FILHO: %d ... processando ...\n", getpid() ); } int main( int argc, char* argv[] ) { int i, pid; for( i=1; i<=3; i++ ) { printf("%d: ", i); pid = fork(); if( pid == 0 ) printf(" FILHO: %d ... processando ...\n", getpid() ); else printf("Pid PAI: %d - Pid FILHO: %d.\n", getpid(), pid ); } wait(NULL); /* Sincroniza com os Processos Filhos */ return 0; }
3. Quando o usuario executar Ctrl-C, um sinal do tipo SIGINT e enviado ao processo que esta executando em foreground. O comportamento default para este processo e o termino do processo. Toda vez que um SIGINT for enviada para o processo, a funcao "sign-hnd" e chamada assincronamente solicitando confirmacao do termino da execucao e caso o usuario responda "n", a funcao retorna e o programa continua normalmente sua execucao.
/* sign-hnd.c - captura interrupcoes do teclado. */ #include#include #include /* **************************************** Includes */ #include /* ************************************************** signal_hand */ void signal_hand( int arg ) { int ch; printf("Tem certeza que quer Finalizar [s/n] ? "); ch = getchar(); if( ch == 's' || ch == 'S' ) exit( 0 ); } /* ************************************************** Main Program */ int main( int argc, char* argv[] ) { int i; printf("Processo: ... processando ...\n"); signal( SIGINT, signal_hand ); for( ; ; ) ; printf("Processo: ... processando ...\n"); exit(0); }