Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

365
Visualizações
Los resultados de printf() y system() están en el orden incorrecto cuando la salida se redirige a un archivo

Tengo un programa en C que se compila en un ejecutable llamado myprogram. Esta es su función principal:

 int main(int argc, char ** argv) { printf("this is a test message.\n"); system("ls"); return 0; }

Cuando ejecuto myprogram > output.txt en un shell de Linux y luego examino output.txt, veo el resultado de ls en la lista anterior "este es un mensaje de prueba".

Siento que debería ser al revés. ¿Por qué sucede esto y qué puedo hacer para que aparezca "este es un mensaje de prueba" en la parte superior de output.txt?

Si importa, soy nuevo en C y trabajo en una línea de comandos.

over 4 years ago · Santiago Trujillo
3 Respostas
Responde à pergunta

0

Sospecho que se debe al orden en que se vacía el búfer de salida estándar, que no es necesariamente determinista. Es posible que el padre genere el proceso ls y no vacíe su propia salida estándar hasta que regrese. Es posible que en realidad no vacíe la salida estándar hasta que finalice el proceso.

Intente agregar fflush (stdout) después de la declaración printf y vea si eso obliga a que la salida aparezca primero.

over 4 years ago · Santiago Trujillo Relatório

0

Está relacionado con el almacenamiento en búfer de salida. Me las arreglé para reproducir el mismo comportamiento. Forzar el rubor lo hizo por mí.

 #include <stdio.h> #include <stdlib.h> int main(int argc, char ** argv) { printf("this is a test message.\n"); fflush(stdout); system("ls"); return 0; }

Antes de agregar el fflush:

 $ ./main > foo $ cat foo main main.c this is a test message.

y después:

 $ ./main > foo $ cat foo this is a test message. foo main main.c
over 4 years ago · Santiago Trujillo Relatório

0

De forma predeterminada, la salida a stdout tiene un búfer de línea cuando se conecta a un terminal. Es decir, el búfer se vacía cuando está lleno o cuando agrega una nueva línea.

Sin embargo , si stdout no está conectado a una terminal, como sucede cuando redirige la salida de su programa a un archivo, entonces stdout se almacena completamente en búfer . Eso significa que el búfer se vaciará y se escribirá cuando esté lleno o cuando se vacíe explícitamente (lo que sucede cuando el programa sale).

Esto significa que la salida de un proceso separado iniciado desde su código (como lo que sucede cuando llama al system ) probablemente se escribirá primero, ya que el búfer de ese proceso se vaciará cuando finalice ese proceso, que es antes de su propio proceso.

Qué sucede cuando se usa la redirección (o tuberías para el caso):

  1. Su llamada printf escribe en el búfer de stdout estándar.
  2. La función system inicia un nuevo proceso, que escribe en su propio búfer.
  3. Cuando el proceso externo (iniciado por su llamada al system ) finaliza, su búfer se vacía y se escribe. Su propio búfer en su propio proceso, no se toca.
  4. Su propio proceso finaliza y su stdout de salida estándar se vacía y se escribe.

Para obtener la salida en el orden "correcto" (o al menos esperado), llame a fflush antes de llamar a system , para vaciar explícitamente stdout , o llame a setbuf antes de cualquier salida para deshabilitar el almacenamiento en búfer por completo.

over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda