C/Visual C - SIMULADOR DE PROCESOS

 
Vista:
sin imagen de perfil
Val: 3
Ha disminuido 1 puesto en C/Visual C (en relación al último mes)
Gráfica de C/Visual C

SIMULADOR DE PROCESOS

Publicado por Juan (2 intervenciones) el 04/03/2017 08:11:21
Buen día

Alguien podría decirme como simular 2 procesos en c/c++

Tengo que crear 2 procesos que se ejecuten un cierto tiempo,
manejarlos desde el método principal, y decir cuanto tiempo se ejecuto cada proceso,
y al cuanto tiempo se detuvo, poder detener y después ejecutar el otro proceso.

Saludos.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 296
Bronce
Ha mantenido su posición en C/Visual C (en relación al último mes)
Gráfica de C/Visual C

SIMULADOR DE PROCESOS

Publicado por agustin (272 intervenciones) el 04/03/2017 10:09:59
No me quedo muy claro lo que pretendes pero por lo que entiendo lo que quieres es que tu proceso principal pueda ejecutar y detener otros procesos y saber cuanto tiempo se mantuvo abierto. Supongo que para eso te basta con usar algún método de comunicación entre procesos y que cuando se ejecute un proceso llame por ejemplo a GetTickCount y al cerrarse la vuelva a llamar y la diferencia entre ambos resultados seria el tiempo de ejecución del proceso y solo tendría que enviar ese valor como mensaje y por ejemplo el nombre del proceso.
Para comunicarse entre procesos se pueden usar memoria compartida, tuberías, sockets, o cola de mensajes. Busca información porque es diferente dependiendo si trabajas sobre Unix o Windows.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 3
Ha disminuido 1 puesto en C/Visual C (en relación al último mes)
Gráfica de C/Visual C

SIMULADOR DE PROCESOS

Publicado por Juan (2 intervenciones) el 04/03/2017 16:55:15
Hola buen día

Gracias por la respuesta, exactamente eso es lo que pretendo hacer,
el s.o. con el que trabajo es windows, no sabes donde podría encontrar algún ejemplo?

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 296
Bronce
Ha mantenido su posición en C/Visual C (en relación al último mes)
Gráfica de C/Visual C

SIMULADOR DE PROCESOS

Publicado por agustin (272 intervenciones) el 04/03/2017 22:26:28
Yo los he hecho alguna vez usando borland c++builder y no es lo mismo que como se hace en C o c++ pero por ejemplo para usar sendmessaje con WM_COPYDATA tienes información por la Red. La idea es que el proceso que envía la información tiene que enviar ese mensaje con un puntero a una estructura con la que tienes acceso a la memoria compartida y el que recibe tiene que tener un manejador de mensajes donde gestiones el mensaje WM_COPYDATA y básicamente el que envía debería llamar por ejemplo a GetTickCount al inicio y justo antes de cerrarse y la diferencia es lo que debe mandar a la memoria compartida. En cuanto recibas el evento en el proceso sabrás que la aplicación se cerró y tendrás el tiempo que estuvo abierta. La verdad es que no es sencillo encontrar información que no esté orientación data a visual c++ o cosas así y buscar algo que funcione sobre un entorno diferente te va a costar.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 296
Bronce
Ha mantenido su posición en C/Visual C (en relación al último mes)
Gráfica de C/Visual C

SIMULADOR DE PROCESOS

Publicado por agustin (272 intervenciones) el 06/03/2017 13:27:50
No se si llego tarde pero he estado trasteando con los sockets en windows y te he preparado un ejemplo no sin esfuerzo porque yo soy newbie pero me gustan los retos jejeje.
Aqui el codigo del servidor:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
#include <stdio.h>
#include <windows.h>
 
#define MAX_THREADS 2
 
typedef struct DatosServidor {
    SOCKET conn_socket;
} DATOS_SERVIDOR;
 
DWORD WINAPI MyThreadFunction( LPVOID lpParam );
void ErrorHandler(char *NameFunction);
 
int main(int argc, char *argv[]){
 
    //Necesarias para crear los hilos
    DWORD   dwThreadIdArray[MAX_THREADS];
    HANDLE  hThreadArray[MAX_THREADS];
    int i;
 
    //Necesarias para crear el servidor
    DATOS_SERVIDOR datos;
    WSADATA wsaData;
    struct sockaddr_in server;
    struct hostent *hp;
    int resp;
 
    //Inicializamos la DLL de sockets
    resp=WSAStartup(MAKEWORD(1,0),&wsaData);
    if(resp){
        printf("Error al inicializar socket\n");
        getchar();
        return resp;
    }
 
    //Obtenemos la IP que usará nuestro servidor...
    // en este caso localhost indica nuestra propia máquina...
    hp=(struct hostent *)gethostbyname("localhost");
 
    if(!hp){
        printf("No se ha encontrado servidor...\n");
        getchar();
        WSACleanup();
        return WSAGetLastError();
    }
 
    // Creamos el socket...
    datos.conn_socket=socket(AF_INET,SOCK_STREAM, 0);
    if(datos.conn_socket==INVALID_SOCKET) {
        printf("Error al crear socket\n");
        getchar();
        WSACleanup();
        return WSAGetLastError();
    }
 
    memset(&server, 0, sizeof(server)) ;
    memcpy(&server.sin_addr, hp->h_addr, hp->h_length);
    server.sin_family = hp->h_addrtype;
    server.sin_port = htons(6000);
 
    // Asociamos ip y puerto al socket
    resp=bind(datos.conn_socket, (struct sockaddr *)&server, sizeof(server));
    if(resp==SOCKET_ERROR){
        printf("Error al asociar puerto e ip al socket\n");
        closesocket(datos.conn_socket);
        WSACleanup();
        getchar();
        return WSAGetLastError();
    }
 
    if(listen(datos.conn_socket, 1)==SOCKET_ERROR){
        printf("Error al habilitar conexiones entrantes\n");
        closesocket(datos.conn_socket);
        WSACleanup();
        getchar();
        return WSAGetLastError();
    }
 
    printf("Esperando conexiones entrantes... \n");
 
    for(i=0; i<MAX_THREADS; i++ )
    {
        // Creo el hilo para iniciar la ejecución en su función
 
        hThreadArray[i] = CreateThread(
            NULL,                   // default security attributes
            0,                      // use default stack size  
            MyThreadFunction,       // thread function name
            &datos,                 // argument to thread function
            0,                      // use default creation flags
            &dwThreadIdArray[i]);   // returns the thread identifier
 
        // Compruebo el valor de retorno
        // Si CreateThread falla, termino la ejecución
        // Esto limpiará automáticamente los hilos y la memoria
 
        if (hThreadArray[i] == NULL)
        {
           ErrorHandler("CreateThread");
           getchar();
           return 3;
        }
    } // Fin del bucle de creacion de hilos
 
    // Espero a que terminen todos los hilos
    WaitForMultipleObjects(MAX_THREADS, hThreadArray, TRUE, INFINITE);
 
    // Como no vamos a aceptar más conexiones cerramos el socket escucha
    closesocket(datos.conn_socket);
 
    // Cerramos liberia winsock
    WSACleanup();
 
    // Cierro todos los handles de los hilos
    for(i=0; i<MAX_THREADS; i++)
    {
        CloseHandle(hThreadArray[i]);
    }
    printf("Fin de recepcion de mensajes");
    getchar();
    return (EXIT_SUCCESS);
}
 
DWORD WINAPI MyThreadFunction( LPVOID lpParam )
{
    char RecvBuff[100];
    SOCKET comm_socket;
    DATOS_SERVIDOR *datos;
    struct sockaddr_in client;
    int stsize;
 
    datos=(DATOS_SERVIDOR*)lpParam;
 
    // Aceptamos conexiones entrantes
    stsize=sizeof(struct sockaddr);
    comm_socket=accept(datos->conn_socket,(struct sockaddr *)&client,&stsize);
    if(comm_socket==INVALID_SOCKET){
        printf("Error al aceptar conexión entrante\n");
        getchar();
        return WSAGetLastError();
    }
    printf("Conexion entrante desde: %s\n", inet_ntoa(client.sin_addr));
 
    printf("Recibiendo Mensajes... \n");
    recv (comm_socket, RecvBuff, sizeof(RecvBuff), 0);
    printf("Datos recibidos: %s \n", RecvBuff);
 
    // Cerramos el socket de la comunicacion
    closesocket(comm_socket);
 
    return 0;
}
 
void ErrorHandler(char *NameFunction)
{
    LPVOID lpMsgBuf;
    DWORD dw = GetLastError();
 
    // Recupero el mensaje de error del sistema para el último error ocurrido
    FormatMessage(
        FORMAT_MESSAGE_ALLOCATE_BUFFER |
        FORMAT_MESSAGE_FROM_SYSTEM |
        FORMAT_MESSAGE_IGNORE_INSERTS,
        NULL,
        dw,
        MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
        (LPTSTR) &lpMsgBuf,
        0, NULL );
 
    // Muestro el mensaje de error
    printf("Error: %s failed with error %d: %s",NameFunction, dw, lpMsgBuf);
 
    // Libero la memoria allocada
    LocalFree(lpMsgBuf);
}

Aqui el del cliente:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
 
int main(int argc, char *argv[]){
 
    WSADATA wsaData;
    SOCKET conn_socket;
    struct sockaddr_in server;
    struct hostent *hp;
    int resp,salida;
    unsigned long inicio,fin,lapso;
    char SendBuff[100];
    HWND windowHandle;
    DWORD processID;
 
    //Obtengo el tiempo en el que inicia el proceso
    inicio=GetTickCount();
 
    //Inicializamos la DLL de sockets
    resp=WSAStartup(MAKEWORD(1,0),&wsaData);
    if(resp){
        printf("Error al inicializar socket\n");
        getchar();
        return -1;
    }
 
    //Obtenemos la IP del servidor... en este caso
    // localhost indica nuestra propia máquina...
    hp=(struct hostent *)gethostbyname("localhost");
 
    if(!hp){
        printf("No se ha encontrado servidor...\n");
        getchar();
        WSACleanup();
        return WSAGetLastError();
    }
 
    // Creamos el socket...
    conn_socket=socket(AF_INET,SOCK_STREAM, 0);
    if(conn_socket==INVALID_SOCKET) {
        printf("Error al crear socket\n");
        getchar();
        WSACleanup();
        return WSAGetLastError();
    }
 
    memset(&server, 0, sizeof(server)) ;
    memcpy(&server.sin_addr, hp->h_addr, hp->h_length);
    server.sin_family = hp->h_addrtype;
    server.sin_port = htons(6000);
 
    // Nos conectamos con el servidor...
    if(connect(conn_socket,(struct sockaddr *)&server,sizeof(server))==SOCKET_ERROR){
        printf("Fallo al conectarse con el servidor\n");
        closesocket(conn_socket);
        WSACleanup();
        getchar();
        return WSAGetLastError();
    }
    printf("Conexion establecida con: %s\n", inet_ntoa(server.sin_addr));
 
    //Esto lo pongo para tener una salida del proceso aleatoria
    //No es necesaria para nada pero al menos asi consigo simular
    //que el proceso hace algo mas a parte de comunicarse
    srand(time(NULL));
    do{
        salida = rand()%1000;
        Sleep(10);
    }while(salida != 0);
 
    //Obtengo el tiempo en que termina el proceso
    fin=GetTickCount();
 
    //Obtengo el lapso de tiempo transcurrido
    lapso=fin-inicio;
 
    processID = GetCurrentProcessId();
 
    //Enviamos el lapso de tiempo que transcurrio...
    printf("Enviando lapso de tiempo... \n");
    sprintf(SendBuff,"El proceso con PID: %lu ha funcionado durante %lu milisegundos.",processID,lapso);
    send(conn_socket,SendBuff,sizeof(SendBuff),0);
    printf("Lapso enviado: %lu milisegundos\n", lapso);
 
    // Cerramos el socket y liberamos la DLL de sockets
    closesocket(conn_socket);
    WSACleanup();
    getchar();
    return EXIT_SUCCESS;
}

Estan hechos en C, primero ejecutas el servidor y luego el cliente tantas veces como indique MAX_THREADS en el codigo del servidor (en este caso 2 veces) y se conectarán al servidor para enviarle el tiempo que han estado funcionando mas o menos ya que hay codigo despues pero es minimo jejeje.
Esa es la idea y para saber cuanto tiempo estuvo un cliente tienes que hacer lo mismo que hago yo en el codigo del cliente y pones lo que quieres que haga ese programa donde tengo el bucle con rand sustituyendolo.
Si los procesos no son tuyos y no puedes modificar su codigo para hacer lo que hago yo, te quedarian pocas opciones. La primera seria un bucle que buscara continuamente la ventana del proceso y te avise cuando ya no la encuentre y la segunda seria crear una dll con mi codigo e inyectarla al proceso y ahi la cosa ya se complica.
Ya me cuentas que tal.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar