.::IPC::Pipes::. :Introdução: Essa é a primeira parte de uma série de tutoriais explicando sobre Inter Process Comunication, que ficará nessa ordem: pipes signal shared memory sockets Mostrarei aqui, como usar pipes (canos) nessa parte do tuto. Pipes são formas de você poder "conectar" processos apartir de "canos", podendo chamar um processo, e enviar a ele algumas informações, ou captar informações dele. :Função pipe(): [prot header: unistd.h] int pipe(int filedes[2]); [/prot] Essa função gera um par de FDs (File Descriptors) apontando para um pipe do processo. O filedes[0] é para leitura, filedes[1] é para escrita. Se a função rodar OK, retorna 0, em erro, retorna -1. Para escrever ou ler no pipe, usa-se read() e write(), para fecha-lo, close() Aqui um exemplo de uso do pipe(): [code pipe1.c] #include #include #include int main() { int fd[2]; pipe(fd); if(!fork()) { close(fd[1]); } else { close(fd[0]); } return 0; } [/code] Esse programa não faz lá muita coisa, só gera o pipe, caso gere o filho, mata o fd para escrita, se não, mata o fd para leitura :Função popen(): [prot header: stdio.h] FILE *popen(const char *command, const char *type); int pclose(FILE *stream); [/prot] A função popen() abre um processo, criando um pipe, forkeando, e chamando-o na shell. Infelizmente é unidirecional algo aberto via popen, ou é para leitura, ou para escrita. A variável command seria o comando a ser chamado, como "ps", "bash", etc, enquanto type seria o tipo, "r" para leitura, "w" para escrita. Pclose fecha algum pipe com popen(). Popen retorna NULL caso dê erro, pclose retorna -1 se der erro. [code pipe2.c] #include #include #include int main() { FILE *p; char buffer[1024]; p = popen("ps aux", "r"); if(!p) { perror("Popen"); exit(1); } while(!feof(p)) { memset(buffer, 0, 1024); fgets(buffer, 1024, p); printf("%s", buffer); } pclose(p); return 0; } [/code] Esse exemplo é MUITO simples, mas já dá para entender como funciona popen() e pclose(), assim, algum projeto seu usando-os, depende de vossa criatividade ;) :Bibliografia: Manuais padrão do linux. :Contato: morte137@gmail.com fpc@bsdmail.org :Finalização: Esse assunto é relativamente simples, mas ajuda bastante, e é uma base para se ter sobre IPC.