elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Proceso que retorna 141 en Linux.
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Proceso que retorna 141 en Linux.  (Leído 3,092 veces)
0xDani


Desconectado Desconectado

Mensajes: 1.077



Ver Perfil
Proceso que retorna 141 en Linux.
« en: 27 Octubre 2012, 20:38 pm »

Bueno pues tengo un programa, lo ejecuto y se corta a la mitad de la ejecucion, y al comprobar el valor de retorno:
Código:
echo $?
la salida es 141. ¿Que significa esto?

Saludos.

EDIT: Vale ya lo tengo, se ha enviado una señal SIGPIPE a mi proceso, parece que escribe sobre sockets que no estan conectados. Es decir, se me desconectan los sockets. ¿Puedo tratar de detectar si un socket esta conectado o no y reconectarlo sin que se cierre el programa?¿O de hacer un handler para esta señal?


« Última modificación: 27 Octubre 2012, 20:50 pm por 0xDani » En línea

I keep searching for something that I never seem to find, but maybe I won't, because I left it all behind!

I code for $$$
Hago trabajos en C/C++
Contactar por PM
xiruko


Desconectado Desconectado

Mensajes: 438


Ver Perfil
Re: Proceso que retorna 141 en Linux.
« Respuesta #1 en: 27 Octubre 2012, 20:54 pm »

Citar
¿Puedo tratar de detectar si un socket esta conectado o no y reconectarlo sin que se cierre el programa?¿O de hacer un handler para esta señal?

getpeername()

y para lo otro, aunque ya lo hayas encontrado, por si acaso no lo has hecho asi, tienes todos los errores definidos en el archivo de cabecera syscall.h, que lo tendras en /usr/include o por ahi.

un saludo!


En línea

0xDani


Desconectado Desconectado

Mensajes: 1.077



Ver Perfil
Re: Proceso que retorna 141 en Linux.
« Respuesta #2 en: 27 Octubre 2012, 21:31 pm »

getpeername()

y para lo otro, aunque ya lo hayas encontrado, por si acaso no lo has hecho asi, tienes todos los errores definidos en el archivo de cabecera syscall.h, que lo tendras en /usr/include o por ahi.

un saludo!

He puesto un getpeername() antes de escribir al socket, y si retorna ENOTCONN (significa que no esta conectado) vuelve a tratar de reconectar hasta que lo consiga, pero sigue igual, se corta y retorna 141.
En línea

I keep searching for something that I never seem to find, but maybe I won't, because I left it all behind!

I code for $$$
Hago trabajos en C/C++
Contactar por PM
xiruko


Desconectado Desconectado

Mensajes: 438


Ver Perfil
Re: Proceso que retorna 141 en Linux.
« Respuesta #3 en: 27 Octubre 2012, 21:50 pm »

sin el codigo completo es algo dificil adivinar de donde viene el error... :rolleyes:
En línea

0xDani


Desconectado Desconectado

Mensajes: 1.077



Ver Perfil
Re: Proceso que retorna 141 en Linux.
« Respuesta #4 en: 27 Octubre 2012, 22:13 pm »

sin el codigo completo es algo dificil adivinar de donde viene el error... :rolleyes:

Código
  1. #include <sys/socket.h>
  2. #include <arpa/inet.h>
  3. #include <netinet/in.h>
  4. #include <netdb.h>
  5. #include <unistd.h>
  6. #include <pthread.h>
  7. #include <stdio.h>
  8. #include <stdlib.h>
  9. #include <string.h>
  10. #include <errno.h>
  11. #include <limits.h>
  12. #include <sys/types.h>
  13. #include <signal.h>
  14.  
  15. #define MAX_dani 0xF0000
  16.  
  17. struct params{
  18.  char web[20];
  19.  int port;
  20.  int thread;
  21.  int nrequests;
  22.  int sleeptime;
  23. };
  24.  
  25. int total_requests;
  26. pthread_mutex_t lock;
  27. int nthreads;
  28.  
  29. void* t(void *p)
  30. {
  31.  int n = ((struct params*)p)->thread + 1;
  32.  printf("Proceso %i: presente\n", n);
  33.  char request[128];
  34.  char buff[10000] = {'\0'};
  35.  struct hostent *host = gethostbyname(((struct params*)p)->web);
  36.  if(!host)
  37.  {
  38.    printf("Proceso %i: No se ha podido resolver la direccion del servidor\n", n);
  39.    return NULL;
  40.  }
  41.  printf("Proceso %i: host->h_addr: %s\n", n, inet_ntoa(*((struct in_addr *)host->h_addr)));
  42.  struct sockaddr sockbuf;
  43.  int stsize = sizeof(sockbuf);
  44.  struct sockaddr_in sock;
  45.  sock.sin_family = AF_INET;
  46.  sock.sin_port = htons(((struct params*)p)->port);
  47.  sock.sin_addr.s_addr = inet_addr(inet_ntoa(*((struct in_addr *)host->h_addr)));
  48.  printf("Proceso %i: Direccion: %d\n", n, sock.sin_addr.s_addr);
  49.  
  50. int sockfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
  51. if(sockfd==-1)
  52. {
  53.  printf("Proceso %i: No se pudo crear el socket\n", n);
  54.  return NULL;
  55. }
  56. printf("Proceso %i: Socket creado\n", n);
  57. printf("Proceso %i: Conectando...\n", n);
  58. int aux;
  59. connect(sockfd, (struct sockaddr*) &sock, sizeof(struct sockaddr));
  60. printf("Proceso %i: Conectado\n", n);
  61. sprintf(request, "GET / HTTP/1.1\nHost: %s\nUser-Agent: Mozilla/4.0\n\n ", host->h_name);
  62. printf("Proceso %i: Peticion en request\n", n);
  63. for(aux=0; aux<(((struct params*)p)->nrequests); aux++)
  64. {
  65.   switch(getpeername(sockfd, &sockbuf, &stsize))
  66.   {
  67.    case 0: break;
  68.    case ENOTCONN:
  69.     printf("Proceso %i: reconectando socket...", ((struct params*)p)->thread);
  70.     close(sockfd);
  71.     sockfd = socket(AF_INET, SOCK_STREAM, 0);
  72.     if(connect(sockfd, (struct sockaddr*) &sock, sizeof(struct sockaddr))==-1) continue;
  73.     else break;
  74.   }
  75.   write(sockfd, request, strlen(request));
  76.   printf("Proceso %i: %i peticion/es\n", n, aux+1);
  77.   pthread_mutex_lock(&lock);
  78.   total_requests++;
  79.   sleep((((struct params*)p)->sleeptime)/nthreads);
  80.   pthread_mutex_unlock(&lock);
  81. }
  82. close(sockfd);
  83. pthread_exit(NULL);
  84. }
  85.  
  86. int main(int argc, char *argv[])
  87. {
  88. pthread_mutex_init(&lock, NULL);
  89. pthread_t *mythreads = (pthread_t*)malloc(atoi(argv[1])*sizeof(pthread_t));
  90. pthread_attr_t a;
  91. struct params *p = (struct params*)malloc(atoi(argv[1])*sizeof(struct params));
  92. int i, ret, j;
  93. nthreads = atoi(argv[1]);
  94. for(j=0; j<nthreads; j++)
  95. {
  96.  strcpy(p[j].web, argv[2]);
  97.  p[j].thread = j;
  98.  p[j].port = atoi(argv[3]);
  99.  p[j].nrequests = atoi(argv[4]);
  100.  p[j].sleeptime = atoi(argv[5]);
  101. }
  102. pthread_attr_init(&a);
  103. pthread_attr_setstacksize(&a, MAX_dani);
  104. for(i=0; i<nthreads; i++)
  105. {
  106.  ret = pthread_create(&mythreads[i], &a, t, &p[i]);
  107.  switch(ret)
  108.  {
  109.   case 0:
  110.    printf("Thread %i creado\n", i+1);
  111.    break;
  112.   case EAGAIN:
  113.    printf("EAGAIN\n");
  114.    _exit(1);
  115.   case EINVAL:
  116.    printf("EINVAL\n");
  117.    _exit(2);
  118.   case EPERM:
  119.    printf("EPERM\n");
  120.    _exit(3);
  121.  }
  122. }
  123. pthread_attr_destroy(&a);
  124. for(j=0; j<nthreads; j++)
  125. pthread_join(mythreads[j], NULL);
  126. pthread_mutex_destroy(&lock);
  127. printf("Retornaron los hilos\n");
  128. printf("Total de peticiones: %i\n", total_requests);
  129. return 0;
  130. }

Es un flooder, o al menos eso intento. Los parametros son: numero_de_threads web puerto(80) numero_de_peticiones_por_thread tiempo_de_espera. Si le pones 2 threads y unos 10 segundos de espera funciona, pero a partir de 3 threads da igual el tiempo que le pongas, llega a hacer 2 o 3 peticiones por thread.

Saludos.
En línea

I keep searching for something that I never seem to find, but maybe I won't, because I left it all behind!

I code for $$$
Hago trabajos en C/C++
Contactar por PM
xiruko


Desconectado Desconectado

Mensajes: 438


Ver Perfil
Re: Proceso que retorna 141 en Linux.
« Respuesta #5 en: 27 Octubre 2012, 23:47 pm »

uff a ver nunca he usado esta manera para crear distintos hilos de ejecucion, pero creo que en algo puedo ayudar:

1) en cuanto a tu duda inicial:

Código
  1. switch(getpeername(sockfd, &sockbuf, &stsize))
  2.   {
  3.    case 0: break;
  4.    case ENOTCONN:
  5.     printf("Proceso %i: reconectando socket...", ((struct params*)p)->thread);
  6.     //...
  7.  

la funcion getpeername() devuelve 0 en caso de que vaya bien, y -1 en caso de error, y es entonces cuando le da un valor a errno que es el que tu tienes que comprobar. el codigo seria algo asi:

Código
  1. aux=getpeername(sockfd, &sockbuf, &stsize);
  2. if (aux<0 && strcmp("ENOTCONN", strerror(errno))==0) {
  3.     //reconectando socket... etc

2) veo muchas reservas de memoria pero ningun free(). aunque lo normal es que los so modernos se encarguen de liberarla al finalizar el programa, nunca esta de mas ponerlo por si las moscas y para evitar posibles quebraderos de cabeza. te dejo un enlace corto que habla sobre ello:

http://cboard.cprogramming.com/cplusplus-programming/76877-general-malloc-question.html

3) cuando declaras el array de structs:

Código
  1. struct params *p = (struct params*)malloc(atoi(argv[1])*sizeof(struct params));

lo haces como un puntero, pero luego accedes a ellos de esta manera:

Código
  1. p[j].thread = j;
  2. p[j].port = atoi(argv[3]);

no deberias acceder a los campos del struct asi:

Código
  1. *(p[j]).thread=j;

o lo que es lo mismo, asi:

Código
  1. p[j]->thread=j;

en lugar de como tu lo haces? tenia entendido que hacerlo como tu lo haces era solo para un struct estatico. quizas he dicho una burrada, pero me refiero a que pensaba que era para una variable que la declaras asi (lo de estatico no se si esta bien dicho):

Código
  1. struct params p;

y no como un puntero. te funciona bien? si es asi ya lo se para la proxima vez. aunque entonces no se que utilidad tiene el operador '->'.

4) es un codigo que aunque no sea demasiado largo es bastante denso. tu eres quien lo ha codeado y quizas no tengas problemas, pero para quien quiera leerlo e intentar entenderlo cuesta bastante. unos cuantos espaciados y algun que otro comentario ayudarian bastante, y tambien te ayudarian a ti en caso de que dentro de unos meses quieras volver a mirarte el codigo.


5) si no te es mucha molestia podrias colgar el codigo cuando lo acabes ya que a mas de uno le vendra bien para aprender (yo incluido).

un saludo!

pd. estas haciendo este flooder para aquel proyecto en el que os juntasteis unos cuantos de este foro?
En línea

0xDani


Desconectado Desconectado

Mensajes: 1.077



Ver Perfil
Re: Proceso que retorna 141 en Linux.
« Respuesta #6 en: 28 Octubre 2012, 14:30 pm »

 1) Epic fail. Gracias por hacermelo ver!
 2) Me di cuenta esta noche, ya esta corregido, pero gracias de todas formas.
 3) La funcion malloc devuelve un puntero al primer elemento del array. Es decir, p es un puntero a una estructura, equivale a &p[0], luego p[0] es la estructura.
 4) Si, debe ser una buena costumbre documentar el codigo...  :silbar:
 5) Claro, estare encantado de colgarlo.
 
 Bueno voy a ver si me funciona el codigo corrigiendo el fallo y lo cuelgo.

Saludos.
« Última modificación: 28 Octubre 2012, 19:33 pm por 0xDani » En línea

I keep searching for something that I never seem to find, but maybe I won't, because I left it all behind!

I code for $$$
Hago trabajos en C/C++
Contactar por PM
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Enviar orden a un proceso específico (Linux)
Programación C/C++
kst_1985 4 4,605 Último mensaje 13 Mayo 2010, 22:41 pm
por Foxy Rider
[API Google] Acortar URL ??, no me retorna !!
PHP
Diabliyo 1 2,273 Último mensaje 24 Enero 2012, 16:03 pm
por ~ Yoya ~
Se puede ocultar la ejecución de un proceso en un servidor linux?
GNU/Linux
cfernanrodri 4 3,736 Último mensaje 3 Febrero 2012, 17:19 pm
por Mordor
Se puede ocultar la ejecución de un proceso en un servidor linux?
Hacking
cfernanrodri 3 4,797 Último mensaje 22 Febrero 2012, 02:04 am
por Dark Side
Diferencias entre funcion que retorna y no retorna.
Programación C/C++
FKT 7 4,292 Último mensaje 21 Agosto 2015, 00:31 am
por FKT
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines