Ir ao conteúdo
  • Cadastre-se
Entre para seguir isso  
claudio.g.chepa

[Resolvido] Verificar se um arquivo existe em c.

Recommended Posts

Boa tarde, pessoal. Estou tentando fazer uma função que verifica se um arquivo existe, mas não está funcioando corretamente. Acredito que o erro seja porque o arquivo que preciso verificar se existe não tem extensão, não posso fazer nem leitura, nem escrita nele. Só preciso ver se ele existe. Como posso corrigir esta função? Precisa ser em c, não em c++.

//bool eu defini como 1=TRUE e 0=FALSE
bool existeArquivo(const char *nome)
{
FILE *arquivo;
arquivo = fopen( nome, "r" );
if( arquivo ) {
fclose( arquivo );
return TRUE;
}
return FALSE;
}

O arquivo que preciso verficar se existe é um arquivo criado pela função bind() que é usada para comunicação entre processos usando sockets. Preciso verificar se ele existe.

Obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

claudio.g.chepa,

Não encontrei nada de errado nessa função..

Como assim arquivo criado pela bind()? A bind() assinala um nome/endereço a um socket, não cria arquivos.

Talvez com mais código para análise, a gente tenha como identificar o problema...

[]'s

LNW

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara, sou novo em sockets em c. Achei que era a função bind( ) que criava o arquivo.

Veja só, no código, eu defini o seguinte:

#define SOCK_PATH "socket_server"

Depois disso, chamo a função socket(), defino a "struct sockaddr_un servidor". Dentro dela, eu defino o seguinte:

servidor.sun_family = AF_UNIX;
strcpy( servidor.sun_path, SOCK_PATH );

Depois, chamo a função bind() e todo o resto.

Bem. Dito isto, o que eu queria fazer é o seguinte. Eu queria primeiro verificar se o arquivo "socket_server" que eu defini o nome no comando #define já exite. O problema é que a função que eu postei aqui não está encontrando este arquivo! Testei a mesma função com outros tipos de arquivo e deu tudo certo, mas para verificar a existência deste arquivo especificamente, não funciona!

Uso o Debian com Gnome, e quando clico em cima do arquivo com o botão direito e escolho "Propriedades", aparece o seguinte:

Type: socket (inode/socket)

Size: 0 bytes (0 bytes)

O que eu preciso fazer, na verdade, é verificar se um processo servidor já está ativo. Se ele está vivo esperando por conexões dos clientes. Como toda vez que crio o servidor ele cria este arquivo que falei, pensei em fazer uma verificação se o arquivo está presente na pasta, se sim, o servidor está ativo, caso contrário o servidor é criado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá Cláudio,

Com a fstat() você consegue obter essa informação. Se quiser testar pelo path, use a stat().

http://linux.die.net/man/2/fstat

struct stat buf;

memset(&buf, 0, sizeof(struct stat));
fstat(sock, &buf);
resu = S_ISSOCK(buf.st_mode);

sock é o descritor de arquivo que você obtém com a chamada à socket();

S_ISSOCK(m) é uma macro que resolve para um número diferente de 0 se o teste for bem sucedido, ou seja, se o descritor está associado a um socket.

Você poderia chamar um unlink() antes do bind() para garantir que o arquivo de socket não esteja presente no diretório. Se entendi bem, talvez seja isso que você precise fazer; não seria necessário esse teste que você quer fazer...

Enfim, é por aí...

[]'s

LNW

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

LNW. Obrigado por sua ajuda. Na verdade, eu preciso fazer o teste, sim. É que preciso criar um servidor que rodará em background. Este servidor ficará vivo esperando por nós de uma lista encadeada que enviarei de um outro processo cliente. Só pode ser um servidorm por isso faço a checagem, se já existir o arquivo, então o servidos está vivo. Já está funcionando, mas ele não faz esta verificação.

Este seu exemplo eu não consegui fazer funcionar! O valor de resu é sempre 1 se existe o arquivo ou não o valor é sempre 1! Por que isto está acontecendo? Fiz um programinha de teste só para verificar isto. Ele envia um valor inteiro para o servidor e o servidor mostra o número lido.

#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <sys/stat.h>

#define SOCK_PATH "socket_qualquer"

int main( ) {

int descServidor1, descServidor2;
struct sockaddr_un servidor, cliente;
if( ( descServidor1 = socket( AF_UNIX, SOCK_STREAM, 0 ) ) == -1 ) {
perror("Server - Erro na funcao socket( ) ");
return 1;
}
/****************/
int resu = 0;
struct stat buf;
memset(&buf, 0, sizeof(struct stat));
fstat(descServidor1, &buf);
resu = S_ISSOCK(buf.st_mode);
printf("\ns-> %d.\n", resu );
/***************/
memset( &servidor, 0, sizeof( struct sockaddr_un ) );
servidor.sun_family = AF_UNIX;
strcpy( servidor.sun_path, SOCK_PATH );

if( bind( descServidor1, ( struct sockaddr * )&servidor, sizeof( struct sockaddr_un ) ) == -1 ) {
perror("Server - Erro na funcao bind( ) ");
return 1;
}

if( listen( descServidor1, 5 ) == -1 ) {
perror("Server - Erro na funcao listen( ) ");
return 1;
}

printf("Servidor criado.\n");

while( 1 ) {

int tamanhoCliente = sizeof( cliente );
if( ( descServidor2 = accept( descServidor1, ( struct sockaddr * )&cliente, &tamanhoCliente ) ) == -1 ) {
perror("Server - Erro na funcao accept( ) ");
return 1;
}

int tamanho, val;
tamanho = recv( descServidor2, &val, 4, 0 );
if ( tamanho < 0 ) {
perror("Server - Erro na funcao recv( ) ");
return 1;
}

printf("Server - O valor recebido pelo servidor é: %d.", val );

if( val == 99 ){
break;
}

}
close( descServidor2 );
unlink( servidor.sun_path );
return 0;
}

//Cliente.
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/un.h>

#define SOCK_PATH "socket_qualquer"

int main(void) {

int descServidor1, comprimento;
struct sockaddr_un cliente;

if( ( descServidor1 = socket( AF_UNIX, SOCK_STREAM, 0 ) ) == -1 ) {
perror("Cliente - Erro na funcao socket( ) ");
return 1;
}

cliente.sun_family = AF_UNIX;
strcpy(cliente.sun_path, SOCK_PATH);
comprimento = strlen(cliente.sun_path) + sizeof(cliente.sun_family);

if( connect( descServidor1, ( struct sockaddr * )&cliente, comprimento ) == -1 ) {
perror("Cliente - Erro na funcao connect( ) ");
return 1;
}

printf("Cliente - voce esta conectado.\n");
printf("Cliente - Digite um numero para ser enviado ao servidor.\n");
printf("Cliente - numero: ");
int val;
scanf("%d", &val);
if( send( descServidor1, &val, 4, 0 ) == -1 ) {
perror("Cliente - Erro na funcao send( ) ");
return 1;
}

close( descServidor1 );

return 0;

}

Compartilhar este post


Link para o post
Compartilhar em outros sites

chepa,

Usando fstat() com o socket aberto (descritor válido), o retorno será sempre 1 (no caso do seu programa). Se você der um close() e depois testar com fstat(), o retorno será 0.

Usando stat(), ele deve retornar o valor desejado de acordo com a presença do arquivo de socket (independentemente de haver um socket aberto ou não).

memset(&buf, 0, sizeof(struct stat));
stat(servidor.sun_path, &buf);
resu = S_ISSOCK(buf.st_mode);

Teste aí...

[]'s

LNW

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
Usando stat(), ele deve retornar o valor desejado de acordo com a presença do arquivo de socket (independentemente de haver um socket aberto ou não).

LNW.

Era disso que eu estava falando. Da presença do arquivo na pasta ou não. Você escreveu isso no post #4.

Se quiser testar pelo path, use a stat().

Foi distração minha.

Tenho uma outra dúvida sobre sockets quanto a função recv( ), mas criarei um outro tópico, pois se trata de outro assunto.

Muito obrigado por sua ajuda.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Caso o autor do tópico necessite, o mesmo será reaberto, para isso deverá entrar em contato com a moderação solicitando o desbloqueio.

Compartilhar este post


Link para o post
Compartilhar em outros sites
Visitante
Este tópico está impedido de receber novos posts.
Entre para seguir isso  





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×