Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: erest0r en 2 Julio 2015, 19:17 pm



Título: Duda: Programa devolviendo valor a otro programa
Publicado por: erest0r en 2 Julio 2015, 19:17 pm
Hola, me he puesto a probar en crear un programa recibiendo valor de otro programa, este es el pequeño ejemplo:

Primer programa:
uno.cpp -> g++ -o uno.out uno.cpp
Código
  1. int main()
  2. {
  3.    return 20;
  4. }
  5.  

Segundo programa:
dos.cpp -> g++ -o dos.out dos.cpp
Código
  1. #include <iostream>
  2. #include <cstdlib>
  3.  
  4. int main() {
  5.    int resultado = system("./uno.out");
  6.    std::cout << resultado;
  7.  
  8.    return 0;
  9. }
  10.  

En este caso, cuando ejecuto dos.out mi salida es de 5120 (no se que resultado les arroje a uds), y si coloco otro valor de retorno en uno.cpp, devuelve un valor distinto. ¿Alguien me puede explicar?

Gracias.


Título: Re: Duda: Programa devolviendo valor a otro programa
Publicado por: ivancea96 en 2 Julio 2015, 19:30 pm
Código
  1. #include <iostream>
  2.  
  3. using namespace std;
  4.  
  5. int main(int argc, char** args){
  6.    if(argc>1)
  7.        return 666;
  8.    system("pause");
  9.    cout << system("a.exe a") << endl;
  10.    system("pause");
  11. }

En Windows, funciona correctamente. Tal vez sea coisa de Linux.

Edito: Echa una ojeada a http://linux.die.net/man/3/system (http://linux.die.net/man/3/system).


Título: Re: Duda: Programa devolviendo valor a otro programa
Publicado por: user-marcos en 2 Julio 2015, 19:39 pm
Código
  1. #include <iostream>
  2. #include <cstdlib>
  3. #include <fstream>
  4.  
  5. int main() {
  6.  
  7.    system("./uno.out >a.txt");
  8.    ifstream f ("a.txt");
  9.    string s;
  10.    getline(f,s);
  11.    const char * c = s.c_str();
  12.    int resultado = atoi(c);
  13.    std::cout << resultado;
  14.  
  15.    return 0;
  16. }
  17.  


Título: Re: Duda: Programa devolviendo valor a otro programa
Publicado por: erest0r en 2 Julio 2015, 21:26 pm
Quizas sea el linux, estoy usando ubuntu 14.04 LTS, el codigo de ivancea igualmente me arroja numero distinto al que supuestamente deberia retornar en el codigo, y el es user-marcos  arroja 0, incluso pasando std::ifstream::in en el constructor.


Título: Re: Duda: Programa devolviendo valor a otro programa
Publicado por: user-marcos en 2 Julio 2015, 21:52 pm
Correcto:
con esto de aquí, se redirige el flujo de salida (por terminal), hacía a.txt
Código
  1. system("./uno.out >a.txt");
  2.  

Una opción un poco chapucera sería:
Código
  1. #include <iostream>
  2. int main()
  3. {
  4. std::cout << 20;
  5. }
  6.  

Código
  1. #include <iostream>
  2. #include <cstdlib>
  3. #include <fstream>
  4. using namespace std;
  5. int main() {
  6.  
  7.    ifstream f ("a.txt");
  8.    system("./uno.out > a.txt");    
  9.    string s;
  10.    getline(f,s);
  11.    const char * c = s.c_str();
  12.    int resultado = atoi(c);
  13.    cout << resultado;
  14.    return 0;
  15. }
  16.  


Título: Re: Duda: Programa devolviendo valor a otro programa
Publicado por: ivancea96 en 2 Julio 2015, 22:06 pm
http://stackoverflow.com/questions/14222172/detecting-meaning-of-system-functions-return-value-in-linux (http://stackoverflow.com/questions/14222172/detecting-meaning-of-system-functions-return-value-in-linux)

Busca por ahí.

EDITO: Tras probar en Linux...

Código
  1. #include <iostream>
  2. #include <cstdlib>
  3.  
  4. using namespace std;
  5.  
  6. int main(int argc, char** args){
  7.    if(argc>1)
  8.        return 200;
  9.    cin.get();
  10.    int ret = system("./a.exe a");
  11.    cout << WEXITSTATUS(ret) << endl;
  12.    cin.get();
  13. }

WEXITSTATUS es un macro que recoge el estado del programa. El límite es de 0 a 255 incluído.

Hay otros macros que recogen otras posibilidades, y los puedes ver en el link que puse en el segundo mensaje.


Título: Re: Duda: Programa devolviendo valor a otro programa
Publicado por: erest0r en 3 Julio 2015, 01:38 am
Gracias a ambos por la ayuda, el WEXITSTATUS si me sirvio. Buscando como referencia ese macro encontre este link con otros macros por si alguna otra persona esta interesada tambien: http://www.gnu.org/software/libc/manual/html_node/Process-Completion-Status.html