dhclient не получает аренду / IP-адрес от dhcp, но Windows получает его

El trasfondo importante aquí es que stdoutdebe estar en el búfer de línea por el estándar como configuración predeterminada.

Esto hace que \nlimpie la salida.

Dado que el segundo ejemplo no contiene la nueva línea, la salida no se vacía y como fork()copia todo el proceso, también copia el estado del búfer stdout.

Ahora, estas llamadas fork()en su ejemplo crean 8 procesos en total -todos ellos con una copia del estado del búfer stdout.

Por definición, todos estos procesos llaman a exit()cuando regresan de main()y exit()llaman a fflush()seguido de fclose()en todas las transmisiones stdio activas. Esto incluye stdouty, como resultado, ve el mismo contenido ocho veces.

Es una buena práctica llamar a fflush()en todos los flujos con salida pendiente antes de llamar a fork()o dejar que el niño bifurcado llame explícitamente _exit()que solo sale del proceso sin vaciar los flujos de stdio.

Tenga en cuenta que llamar a exec()no vacía los búferes de stdio, por lo que está bien no preocuparse por los búferes de stdio si (después de llamar afork())llama a exec()y (si eso falla )llame al _exit().

Por cierto :Para comprender que el almacenamiento en búfer incorrecto puede causar, aquí hay un error anterior en Linux que se solucionó recientemente:

El estándar requiere que stderresté sin búfer de forma predeterminada, pero Linux ignoró esto e hizo que stderrtuviera un búfer de línea y (aún peor )tuviera un búfer completo en caso de que stderr fuera redirigido a través de una canalización. Entonces, los programas escritos para UNIX generaron cosas sin nueva línea demasiado tarde en Linux.

Vea el comentario a continuación, parece que ahora está solucionado.

Esto es lo que hago para solucionar este problema de Linux:

    /* 
     * Linux comes with a broken libc that makes "stderr" buffered even 
     * though POSIX requires "stderr" to be never "fully buffered". 
     * As a result, we would get garbled output once our fork()d child 
     * calls exit(). We work around the Linux bug by calling fflush() 
     * before fork()ing. 
     */ 
    fflush(stderr); 

Este código no daña en otras plataformas ya que llamar a fflush()en una transmisión que acaba de vaciarse es un noop.

0
05.06.2019, 12:36
1 ответ

Ответ легко найти после нескольких часов поиска... Это VLAN!

Создается впечатление, что устройства Windows игнорируют VLAN или находят их самостоятельно. (Я проверил через Powershell, и он говорит, что есть пустой идентификатор VLAN)

Но в конце концов я позвонил в службу поддержки оптоволокна, и они сказали мне идентификатор VLAN, и после установки этого идентификатора VLAN в системы Linux (QNAP и маршрутизатор OpenWRT )он работает нормально.

Так что очень плохо, но теперь все в порядке.

Спасибо всем за помощь!

0
28.01.2020, 03:37

Теги

Похожие вопросы