Programación General > Visual C++
Rutinas En Visual C++
Eternal Idol:
--- Cita de: "JuanK" --- pero la filosofia del fork es crear procesos hijos y hasta donde se no se puede hacer hijos en windows o si?
--- Fin de la cita ---
Como poder se puede, bajo el Sistema Operativo Windows (el subsistema POSIX soporta la funcion fork) pero la API Win32 no lo soporta, tendrias que usar funciones indocumentadas de NTDLL.dll, tal vez prefiera crear hilos que procesos, realmente depende de lo que vaya a hacer.
bcasadorodriguez:
os voy a explicar lo que tengo que hacer. Debo hacer una comunicación entre dos programas mediante el uso de pipes (en este caso dos para hacer una conversion duplex hacia ambos lados), desde el primer programa haria una funcion para realizar un fork() (en mi caso es slave.cpp) pero como bien me habeis contado, fork() no existe como tal en windows y para ello se utiliza la función spawn a la que se le pasa como parametro el nombre de otro archivo ejecutable, y los descriptores de las pipes.Una vez que se ejecuta esta funcion se crea como un proceso llamando a la otra funcion ( en mi caso muff.exe )que es el que aproximadamente haria de hijo, y despues el hijo es el que abriría el segundo programa que quiero ejecutar. os voy a poner el código que estoy utilizando, mi problema es que me abre el segundo programa pero no consigo matar el proceso o no sé si todo el código funciona correctamente.
Espero que me entendais, sino os vuelvo a explicar.
slave.cpp
--- Código: Text --- #include "stdafx.h"#include <fcntl.h> #include <io.h> // to use _pipe function#include <stdlib.h> // to use itoa function.#include <process.h> //to use NO_WAIT argument of spawn function, execl#include <Windows.h> #define PIPE_READ 0 #define PIPE_WRITE 1 int p1[2]; // pipe1 int p2[2]; // pipe2 int m_in; int m_out; int state;int endstate; int main(int argc, char* argv[]){ fprintf(stderr, "Starting slave program ....\n"); fflush(stderr); char otherProgramm[] = "muff.exe"; //*create two pipes p1 and p2, return true if the pipes could not be created. if( _pipe(p1,256,O_TEXT)==-1 || _pipe(p2,256,O_TEXT)==-1 ) { perror("pipe failed"); } /*close(0); dup2(p2[PIPE_READ],0); close(1); dup2(p1[PIPE_WRITE],1);*/ char rpipe[20]; char wpipe[20]; // Convert read side of pipe to string and pass as an argument to the child process. in spawnl function itoa( p1[PIPE_READ], rpipe, 10 ); // Convert read side of pipe to string and pass as an argument to the child process. in spawnl function itoa( p2[PIPE_WRITE], wpipe, 10 ); // starting another program if( (state = spawnl(P_NOWAIT, otherProgramm, rpipe, wpipe, NULL))==-1 ) //if( (state = spawnl(P_NOWAIT, otherProgramm, otherProgramm, NULL))==-1 ) { // error closing the pipes close(p1[PIPE_READ]); // close 0 close(p1[PIPE_WRITE]); // close 1 close(p2[PIPE_READ]); // close 0 close(p2[PIPE_WRITE]); // close 1 perror("The process can not be created....\n Spawn failed"); fflush(stderr); } fprintf(stderr, "creating a new process....\n"); fflush(stderr); //assign to m_in and m_out the file descriptors of the pipe for the parent process. m_in = p2[PIPE_READ]; m_out = p1[PIPE_WRITE]; if (cwait(&endstate, state, WAIT_CHILD)== -1) { perror("cwait failed"); } // close descriptors from the child process. close(p2[PIPE_WRITE]); close(p1[PIPE_READ]); TerminateProcess( (HANDLE) state, 1 ); CloseHandle( (HANDLE) state ); fprintf(stderr, "End of slave program....\n"); fflush(stderr); return 0;} [color=red]muff.exe[/color] #include "stdafx.h"#include <stdio.h>#include <io.h>#include <process.h>#include <stdlib.h> int fd1,fd2; void error(int errorCode) { fprintf(stderr, "Return with error code %d\n", errorCode); exit(errorCode); } int main(int argc, char* argv[]){ fprintf(stderr, "Starting muff program ....\n"); fflush(stderr); fprintf(stderr, "the number of arguments are %d \n",argc); fflush(stderr); if (argc !=2) { perror("the number of arguments are <> 2"); exit(2); } // Preparing the redirection of stdin and stdout // assign the file descriptor f1 to the standar input. fd1 = p1[READ] //close( 0 ); /*** slave - stdin ***/ if(close(0) == -1 ) { perror("can not close standard input"); } //sscanf(argv[0],"%d",&fd1); //dup2(fd1, 0); if (sscanf(argv[0],"%d",&fd1) != 1) {perror("sscanf does not work");} if (dup2(fd1, 0)==-1){ perror("dup2 does not work");} // assign the file descriptor f2 to the standar output. fd2 = p1[WRITE] //close( 1 ); /*** slave - stdout ***/ if(close(1) == -1 ) { perror("can not close standard output"); } //sscanf(argv[1],"%d",&fd2); //dup2(fd2, 1); if (sscanf(argv[1],"%d",&fd2) != 1) {perror("sscanf does not work");} if (dup2(fd2, 1)==-1){ perror("dup2 does not work");} /* // assign the file descriptor f2 to the standar error fd2 = p1[WRITE] close( 2 ); // slave - stderr if( dup2(fd2, 2) == -1 ) myerror(6); */ fprintf(stderr, "Starting the program Singular.exe\n"); fflush(stderr); int nexec; //nexec = execl("Singular.exe","Singular.exe",NULL); nexec = execl("C:\\Archivos de programa\\usr\\local\\Singular\\2-0-5\\ix86-Win\\Singular.exe","Singular.exe",NULL); fprintf(stderr, "Ending the muff program \n"); fflush(stderr); return 0;} Tengo muchos comentarios porque voy probando poquito a poco. espero que podais ayudarme.
Muchas gracias.
Eternal Idol:
¿Para que queres matarlo? En realidad cuando devuelve la funcion cwait ese proceso ya no existe mas, aca tenes el output que me genera:
Starting slave program ....
creating a new process....
Starting muff program ....
the number of arguments are 2
Starting the program Singular.exe
Ending the muff program
End of slave program....
Parece correcto, el programa esclavo termina justo despues del muff.
bcasadorodriguez:
en realidad no termina el proceso del segundo programa porque no tengo el pid para poder matarlo, en realidad el proceso que termina es el del segundo programa. Sino puedes comprobarlo en los procesos, cada vez que lo ejecutas donde se encuentran todos los procesos, aparece ese programa abierto tantas veces como ejecutes este programa. de todas formas tampoco me funciona las pipes, no sé como probarlo para ver si envia bien o no la informacion.
Eternal Idol:
--- Cita de: "bcasadorodriguez" --- en realidad no termina el proceso del segundo programa porque no tengo el pid para poder matarlo, en realidad el proceso que termina es el del segundo programa. Sino puedes comprobarlo en los procesos, cada vez que lo ejecutas donde se encuentran todos los procesos, aparece ese programa abierto tantas veces como ejecutes este programa. de todas formas tampoco me funciona las pipes, no sé como probarlo para ver si envia bien o no la informacion.
--- Fin de la cita ---
¿Cual no termina Singular.exe? Ese no lo tengo asi que lo puedo probar pero porque no usas spawnl para ejecutarlo asi podes matarlo.
Navegación
[#] Página Siguiente
[*] Página Anterior
Ir a la versión completa