Parece que ambos hacen lo mismo, ¿eh?¿Cuál es la diferencia entre open y sysopen en Perl?
¿Alguien me puede mostrar un ejemplo en el que hacen un trabajo diferente?
Parece que ambos hacen lo mismo, ¿eh?¿Cuál es la diferencia entre open y sysopen en Perl?
¿Alguien me puede mostrar un ejemplo en el que hacen un trabajo diferente?
sysopen
es una envoltura delgada alrededor de la llamada al sistema open(2)
núcleo (los argumentos corresponden directamente), mientras que open
es un contenedor de nivel superior que le permite hacer redirecciones, tuberías, etc.
A menos que esté trabajando un dispositivo específico que requiere que se pasen algunas banderas especiales al open(2)
vez, para los archivos comunes en el disco, debería estar bien con open
.
Todavía no veo la diferencia, aunque – lexer
@lexer: realmente no hay nada más que decir, el resto es entender lo que es una llamada al sistema, y cuál es la interfaz particular de 'open (2)', todo lo cual es Cosas del sistema operativo, no específicas de Perl. –
@lexer: la respuesta es perfecta. En caso de que necesite un resultado real, considere el combo 'O_WRONLY | O_EXCL | O_CREAT', es decir," crear y escribir si no existe ". Usar '-f ... o abrir ...' en su lugar es solo preguntar por la condición de carrera. – Dallaylaen
Para citar perlopentut:
Si quieres la conveniencia de la cáscara, a continuación, abra de Perl es definitivamente el camino a seguir. Por otro lado, si desea una precisión más fina que la que proporciona el fopen (3S) simplificado de C, debería ver sylpen de Perl, que es un enganche directo a la llamada al sistema open (2). Eso significa que es un poco más complicado, pero ese es el precio de la precisión .
Dado que Perl está escrito en C, ambos métodos probablemente terminen realizando la llamada al sistema open(2)
. La diferencia es que open()
en Perl tiene algunas sutilezas que hacen construidas en apertura, tuberías y redirección muy fácil. Al mismo tiempo, sin embargo, open()
le quita algo de flexibilidad. No tiene ninguna de la funcionalidad Fcntl
disponible en sysopen()
, ni tiene la funcionalidad de enmascaramiento.
La mayoría de las situaciones solo necesitan open()
.
¿Puede proporcionar un ejemplo de 'Fcntl' y la funcionalidad de enmascaramiento disponible en' sysopen'? – lexer
Aquí hay algunos buenos ejemplos de máscaras: http://perldoc.perl.org/perlopentut.html#Permissions-agrave-la-mode, y la sección en el mismo enlace justo arriba donde se encuentra el enlace tiene excelentes ejemplos del 'Fcntl' características. Esa sección comienza con la frase "Y aquí hay cosas que puedes hacer con sysopen que no puedes hacer con una apertura regular". ¡Disfrutar! –
No es una diferencia interna, es una diferencia externa, como dijo Blagovest Buyukliev. – ikegami
@lexer, he agregado un poco más de explicación. Espero eso ayude. –