Thread, Courses, Shell e Aquivo
Publicado por Paulo Augusto de Almeida Ferreira 07/12/2005
[ Hits: 6.705 ]
E ai! blz... estou encaminhando um fonte de um programa que fiz no C... Estou utilizando Threads e um pouco de Courses... Deve ter um jeito melhor de fazer... mas funciona bem... Só tomem cuidado com as definições...
OBS: lista_busca.txt é um documento com nome para executar a busca, ele deve ser linear (linha a linha) para cada nome...
Estou mandando o fonte + os Anexos no download... espero que ajude alguém... hehehe...
//*************************************************************************// //*************************************************************************// //*** ***// //*** Definições: ***// //*** Entrada de Dados - lista_busca.txt ***// //*** Saida de Dados - lista_email.txt ***// //*** Anexos - Shell_Thread.sh ***// //*** busca.pl ***// //*** expressoes.txt ***// //*** ***// //*** Diretorios: ***// //*** /var/spammer ***// //*** /tmp/spammer ***// //*** *Todos os aqruivos devem ficar em /var/spammer ***// //*** *O diretorio /tmp/spammer deve ser criado manualmente ***// //*** ***// //*** Compilando: ***// //*** gcc essearquivo.c -lpthread -o essearquivo.bin -lncurses ***// //*** ***// //*************************************************************************// //*************************************************************************// // Includes // #include <stdio.h> #include <unistd.h> #include <pthread.h> #include <semaphore.h> #include <string.h> #include <time.h> #include <curses.h> #define NUM_THREAD 10 //Num maximo = 30 devido o layout da tela // Definições da Thread // pthread_mutexattr_t mutex_attr; pthread_mutex_t trava_flag; sem_t criado; //Function que trata a existencia da Thread // Variaveis Globais // int num_linhas=0; //numero de linhas do arquivo int linha_atual=0; // Contador de linha executadas int cont_thread[NUM_THREAD]; //Contador da Thread // Sub-Rotinas // void proc_snifer(int *flag); //Thread Sniffer void tela_principal(void); // Principal // int main(void){ FILE *fb; // Variaveis Locais // int i=0; char ch[15]; pthread_t snifer; //Define a Thread pthread_t *ptr_sur_thread; // Define a Thread sem_init(&criado,0,0); //Inicia a função // Definições da Tela // initscr(); //Esta função inicializa a ncurses. Para todos os programas devemos sempre inicializar a ncurses e depois finalizar. start_color(); //Tornando o uso das cores possíveis // Definição dos pares de cores // init_pair(1,COLOR_WHITE,COLOR_BLUE); init_pair(2,COLOR_BLUE,COLOR_WHITE); init_pair(3,COLOR_RED,COLOR_WHITE); init_pair(4,COLOR_GREEN,COLOR_BLACK); init_pair(5,COLOR_BLACK,COLOR_GREEN); init_pair(6,COLOR_RED,COLOR_GREEN); init_pair(7,COLOR_RED,COLOR_BLACK); init_pair(8,COLOR_BLUE,COLOR_BLACK); //Leitura das linhas no aquivo // system("wc -l lista_busca.txt | cut -f 1 -d ' ' >>num_lista.txt"); if ((fb=fopen("num_lista.txt","r")) == NULL){ attron(COLOR_PAIR(7)); move(2,5);printw("Nao abriu"); } fscanf(fb,"%d",&num_linhas); fclose(fb); // Fim da Leitura do arquivo system("rm /var/spammer/num_lista.txt"); // Inicio Sistema Thread for(i=0;i<=NUM_THREAD;i++) //Zera o contolador das Thread cont_thread[i]=1; curs_set(0); tela_principal(); while(linha_atual<=num_linhas){ //Enquanto não verificar todas as linhas do arquivo for(i=0;i<=NUM_THREAD;i++){ //For Thread Create if(cont_thread[i]==1){ // For Thread não existente sleep(4); ptr_sur_thread=(void*)malloc(sizeof(pthread_t)); //Alocação de espaço da memora para 1 ponteiro sleep(1); if(ptr_sur_thread!=NULL){ //Verifica a alocação pthread_create((void*)&ptr_sur_thread, NULL, (void*)&proc_snifer, &i); //Cria a Thread, passa como parametro a Flag pthread_mutex_lock(&trava_flag); //Trava alteração nas variaveis abaixo cont_thread[i]=0; // Indica a existencia da Thread sem_wait(&criado); // Aguarda a Thread Indicar que existe linha_atual+=1; pthread_mutex_unlock(&trava_flag); // Libera as variaves acima } } } attron(COLOR_PAIR(7)); move(NUM_THREAD+5,2);printw("Concluido Start Todas as Threas - Sleep(%d)",NUM_THREAD); //Concluido um Loop Formove(NUM_THREAD+5,2);printw("Concluido Start Todas as Threas - Sleep(%d)",NUM_THREAD*2); //Concluido um Loop For refresh(); tela_principal(); sleep(NUM_THREAD); attron(COLOR_PAIR(7)); move(NUM_THREAD+5,2);printw(" "); move(NUM_THREAD+5,2);printw("Ativando Threas Livres"); //Concluido um Loop For } endwin(); /* Sempre que finalizarmos um programa com a biblioteca curses, devemos executar este comando. */ } void proc_snifer(int *flag){ //Thread Sniffer // Variaveis locais // auto int x; auto int line; char nome[50]; char nome2[10]; x=*flag; line=linha_atual; sem_post(&criado); // Notifica o sistema que a Thread existe attron(COLOR_PAIR(1)); move(x+2,2);printw(" ", x,line); refresh(); move(x+2,2);printw("Iniciando Thread - %d <> Linha %d", x,line); refresh(); strcpy(nome,"sh /var/spammer/Shell_Thread.sh lista_busca.txt "); // Concatena nomes e endereços sprintf(nome2,"%d",line); strcat(nome, nome2); strcat(nome," "); sprintf(nome2,"%d",x); strcat(nome,nome2); sleep(2); system(nome); //Chama a função do Shell ------ valor da variavel "sh/var/spammer/Shell_Thread.sh lista_busca.txt (valor de line) (valor de x) pthread_mutex_lock(&trava_flag); //Trava o uso da variavel cont_thread[x]=1; pthread_mutex_unlock(&trava_flag); // Libera a variavel attron(COLOR_PAIR(2)); move(x+2,2);printw(" ", x,line); refresh(); move(x+2,2);printw("Finalisando Thread - %d", x); refresh(); } void tela_principal(void){ int z; //Tela de Resumo // attron(COLOR_PAIR(4)); move(1,70); printw("//********************************************//"); move(2,70); printw("//*** Resumo das Threads ***//"); move(3,70); printw("//*** ***//"); for(z=0;z<=NUM_THREAD;z++){ //For de Controle interno move(z+4,70); printw("//*** Thread status = ***//");} attron(COLOR_PAIR(7)); for(z=0;z<=NUM_THREAD;z++){ //For de Controle interno move(z+4,87); printw("%d",z);} for(z=0;z<=NUM_THREAD;z++){ //For de Controle interno move(z+4,97); printw("%d",cont_thread[z]);} attron(COLOR_PAIR(4)); move(z+4,70); printw("//*** ***//"); move(z+5,70); printw("//*** Legenda: 1 = Livre - 0 = Funcionando ***//"); move(z+6,70); printw("//*** ***//"); move(z+7,70); printw("//****************************************=***//"); move(z+8,70); printw("//*** ***//"); move(z+9,70); printw("//*** Total de Linhas: ***//"); attron(COLOR_PAIR(7)); move(z+9,95); printw("%d",num_linhas); attron(COLOR_PAIR(4)); move(z+10,70); printw("//*** Total de Linhas Executadas: ***//"); attron(COLOR_PAIR(7)); move(z+10,105); printw("%d",linha_atual); attron(COLOR_PAIR(4)); move(z+11,70); printw("//*** ***//"); move(z+12,70); printw("//********************************************//"); refresh(); }
Controle de estoque com listas
Nenhum coment�rio foi encontrado.
Aprenda a Gerenciar Permissões de Arquivos no Linux
Como transformar um áudio em vídeo com efeito de forma de onda (wave form)
Como aprovar Pull Requests em seu repositório Github via linha de comando
Visualizar arquivos em formato markdown (ex.: README.md) pelo terminal
Dando - teoricamente - um gás no Gnome-Shell do Arch Linux
Como instalar o Google Cloud CLI no Ubuntu/Debian
Mantenha seu Sistema Leve e Rápido com a Limpeza do APT!
Procurando vídeos de YouTube pelo terminal e assistindo via mpv (2025)
Alguém já usou o framework Avalonia para desenvolver interfaces de usu... (4)
Ajuda Pra Melhoria do NFTABLES. (8)
Sinto uma leve lentidão ao arrastar, miniminizar e restauras as janela... (2)
Pastas da raiz foram para a área de trabalho [RESOLVIDO] (7)