Ansi C - Socket fork pthread select

ElRenegao

Estoy aprendiendo a programar socket y ahi va mi primer ejemplo de fork()

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
/***********************************************
 | compile:   [b]cc -o vader vader.c[/b]
 ***********************************************/

int main(int argc, char *argv[])
{
     int i;
     pid_t pid;

 while(1)
 {
      printf("Anakin, Yo Soy tu padre (Darth Vader)!!!!!!!!!!!!\t\n");
      pid = fork();
      if(pid < 0)
      {
           /*----------------------------------------------------------*\
           |
           |   ha Ocurrido un Error (-1)
           |   Cuando fork() retorna valor < 0 --> No se ha podido Bifurcar
           |
           \*----------------------------------------------------------*/
           printf("Auch, Me quede sin Hijo...Que hijo de...\t\n");
           exit(1);
      }
      if(pid == 0)
      {
           /*----------------------------------------------------------*\
           |
           |   Proceso hijo:
           |   Cuando fork() devuelve 0, estamos en el proceso hijo.
           |   Nota........: exit en lugar de _exit
           \*----------------------------------------------------------*/
           printf("Lord Vader, Yo Soy tu Hijo (Anakin)!!!!!\t\n");
           sleep(2);
           _exit(0);
      }
      else
      {
          printf("Ahá, Vamos de nuevo.....(Darth Vader)\t\n");
          sleep(3);
      }
 }
 return 0;

}

Hanzou

aqui solo hay dos procesos, no hay nada de hilos ni de sockets.
te paso un codigo con sockets, señales y hilos

//SERVIDOR
#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netdb.h>
#include <unistd.h>
#include <netinet/in.h>
#include <signal.h>

#define PORT 4000

void f (int signun){
int status;
	printf("Has Entrat");
	wait(&status);
	signal(SIG_CHLD,f);
}

void atendre_client (int id)
{
int num;
char cadena[255];
read(id,&num,sizeof(int));
read(id,&cadena,num);
printf("Hola %s !! \n",cadena);
}

int main (int argc, char *argv[]){
int sockid,m,i,id,num,f;
char cadena[80];
struct sockaddr_in srv,clnt;
if ((sockid=socket(AF_INET,SOCK_STREAM,0))<0)return (-1);
//inicialitzar la estructura de dades de sock_addr_in
srv.sin_family=AF_INET;
srv.sin_port=htons(PORT);
srv.sin_addr.s_addr=htonl(INADDR_ANY);
for (i=0;i<8;i++)srv.sin_zero[i]=(char)0;
if((m=bind(sockid,(const struct sockaddr *)&srv,sizeof(srv)))<0)return(-2);
if((m=listen(sockid,10))<0)return(-3);
int len=sizeof(struct sockaddr_in);
while (1)
	{
	signal(SIG_CHLD,f);
	if ((id=accept(sockid,(struct sockaddr *)&clnt,&len))<0)return (-4);
	if ((f=fork())>=0)
		{		
		switch (f)
			{
			case 0:
				close(sockid);
				atendre_client (id);
				close(id);
				break;
			default:
				close(id);
			}
		}
	}
close(id);
}

Usuarios habituales

  • Hanzou
  • ElRenegao