Pregunta

Soy una especie de novato en C ++, y trabajo en un programa simple en Linux que se supone que invoca otro programa en el mismo directorio y obtiene la salida del programa invocado sin mostrar la salida del programa invocado en la consola. Este es el fragmento de código en el que estoy trabajando:

    pid_t pid;
    cout<<"General sentance:"<<endl<<sentence<<endl;
    cout<<"==============================="<<endl;
    //int i=system("./Satzoo");
    if(pid=fork()<0)
        cout<<"Process could not be created..."<<endl;
    else
    {
        cout<<pid<<endl;
        execv("./Satzoo",NULL);
    }
    cout<<"General sentance:"<<endl<<sentence<<endl;
    cout<<"==============================="<<endl;

Uno de los problemas que encuentro es que puedo imprimir las dos primeras líneas en la consola, pero no puedo imprimir las dos últimas líneas. Creo que el programa deja de funcionar cuando invoco el programa Satzoo. Otra cosa es que este código invoca el programa Satzoo dos veces, ¿no sé por qué? Puedo ver la salida en la pantalla dos veces. Por otro lado, si uso System () en lugar de ExecV (), entonces el Satzoo funciona solo una vez.

No he descubierto cómo leer la salida de Satzoo en mi programa.

Se agradece cualquier ayuda.

Gracias

¿Fue útil?

Solución

No se distingue entre el proceso de los niños y el padre después de la llamada a fork(). Entonces tanto el niño como el padre corren execv() y así se reemplazan sus respectivas imágenes de proceso.

Quieres algo más como:

pid_t pid;
printf("before fork\n");

if((pid = fork()) < 0)
{
  printf("an error occurred while forking\n");
}
else if(pid == 0)
{
  /* this is the child */
  printf("the child's pid is: %d\n", getpid());
  execv("./Satzoo",NULL);
  printf("if this line is printed then execv failed\n");
}
else
{
  /* this is the parent */
  printf("parent continues execution\n");
}

Otros consejos

los fork() Function Clones el proceso actual y devuelve diferente valores en cada proceso. En el proceso de "padre", devuelve el PID del niño. En el proceso infantil, devuelve cero. Por lo tanto, normalmente lo invocaría usando un modelo como este:

if (fork() > 0) {
    cout << "in parent" << endl;
} else {
    cout << "in child" << endl;
    exit(0);
}

He omitido el manejo de errores en lo anterior.

En su ejemplo, las dos rutas de código anteriores (tanto padre como hijo) caen en el else cláusula de tu llamada a fork(), haciendo que ambos execv("./Satzoo"). Es por eso que su programa se ejecuta dos veces y por qué nunca llega a las declaraciones más allá de eso.

En lugar de usar fork() y hacer todo manualmente (administrar adecuadamente la ejecución del proceso es una buena cantidad de trabajo), es posible que esté interesado en usar el popen() función en su lugar:

FILE *in = popen("./Satzoo", "r");
// use "in" like a normal stdio FILE to read the output of Satzoo
pclose(in);

Desde el fork() ManPage:

Valor de retorno
Al finalizar con éxito, Fork () devolverá 0 al proceso del niño y devolverá la identificación del proceso del proceso infantil al proceso principal. Ambos procesos continuarán ejecutándose desde la función Fork (). De lo contrario, -1 se devolverá al proceso principal, no se creará ningún proceso infantil, y ERRNO se establecerá para indicar el error.

Verifica para asegurarse de que tenga éxito, pero no si el pid Indica que estamos en el niño o en el padre. Por lo tanto, tanto el niño como el padre hacen lo mismo dos veces, lo que significa que su programa se ejecuta dos veces y el texto final nunca se imprime. Necesita verificar el valor de devolución de fork() Más de una vez.

EXEC - La familia de funciones exec () reemplaza la imagen del proceso actual con una nueva imagen de proceso.

Sistema: bloquea la ejecución del comando. La ejecución del programa de llamadas continúa después de que el comando del sistema regresa

Hay tres pruebas de valor de retorno que desea con Fork

  1. 0: Eres el niño
  2. -1: error
  3. Otro: eres el padre

Ejecutaste el otro programa tanto del niño como del padre ...

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top