La programación entre padre e hijo ya se ha discutido (al menos )en Cuándo se ejecutan los procesos secundarios y Cómo funciona realmente la llamada al sistema de bifurcación .
Pero en este caso, también está la cuestión del almacenamiento en búfer dentro de stdio
. Está utilizando fprintf()
para escribir en un archivo normal. De forma predeterminada, stdio
almacena la salida en archivos regulares hasta que se escriben suficientes datos, para ahorrar en la sobrecarga de llamadas al sistema. En x86 Linux, por lo general parece escribir en bloques de 4096 bytes, pero no puede contar con eso, a menos que configure el almacenamiento en búfer manualmente (consultesetbuf()
y amigos ).
Puede ver esto con un comando como strace
que muestra las llamadas al sistema que hace un programa.
Entonces, aunque no puede hacer ninguna predicción sobre qué proceso se ejecuta primero, en este caso puede predecir que los a
se escriben consecutivamente, y los b
también.Solo puede obtener bbbbbaaaaaaaaaa
o aaaaaaaaaabbbbb
, y cuál obtiene depende del azar.
My question is this: Why doesn't vim follow this well-established convention? Is there a historical reason, or is it something else?
Потому что vim
следует другому старому и хорошо -установившемуся соглашению, согласно которому Control -C внутри интерактивной программы прерывает текущую команду, а не всю программу. Этому соглашению также следуют интерактивные оболочки --a Control -C уничтожит не вашу оболочку, а команду, которую она выполняла или собиралась выполнить.
Программы, которые не следуют этому соглашению, обычно пытаются смягчить ужас, ловя SIGINT
и спрашивая пользователя «вы действительно хотите выйти» или «используйте выход для выхода» и т. д., что отвлекает их от неприятный до раздражающего.
Другие очень хорошо зарекомендовавшие себя соглашения для Control -C заключаются в том, чтобы использовать его в качестве префикса для других команд (, как в программах, вдохновленных emacs -,где Control -G берет на себя роль Control -C )или для копирования выделения в буфер обмена.