2011-09-20 11 views
8

Sembra che entrambi facciano la stessa cosa, eh?Qual è la differenza tra open e sysopen in Perl?

Qualcuno può mostrarmi un esempio in cui svolgono un lavoro diverso?

+2

Non è una differenza interna, è una differenza esterna, come ha detto Blagovest Buyukliev. – ikegami

+0

@lexer, ho aggiunto un po 'più di spiegazione. Spero che sia d'aiuto. –

risposta

18

sysopen è un wrapper sottile intorno alla chiamata di sistema del kernel open(2) (gli argomenti corrispondono direttamente), mentre open è un wrapper di livello superiore, che consente di fare redirezioni, tubazioni, ecc

A meno che non si sta lavorando un dispositivo specifico che richiede alcune bandiere speciali da passare al tempo open(2), per i file ordinari su disco si dovrebbe andare bene con open.

+0

Non vedo ancora la differenza con – lexer

+2

@lexer: non c'è proprio altro da dire - il resto è capire che cos'è una chiamata di sistema, e quale sia la particolare interfaccia di 'open (2)', tutto ciò che è Roba del sistema operativo, non specifica per Perl. –

+2

@lexer: la risposta è azzeccata. Nel caso abbiate bisogno di un esempio reale, considerate la combinazione "O_WRONLY | O_EXCL | O_CREAT', cioè" crea e scrivi se non esiste ". Usare '-f ... o apri ... 'invece sta solo chiedendo le condizioni di gara. – Dallaylaen

12

Per citare perlopentut:

Se si desidera che la convenienza della shell, quindi open di Perl è sicuramente la strada da percorrere. D'altra parte, se si desidera una precisione più precisa di rispetto alla semplice fopen (3S) di C, si dovrebbe guardare a sysopen di Perl, che è un hook diretto nella chiamata di sistema open (2). Ciò significa che è un po 'più coinvolto, ma questo è il prezzo della precisione .

Poiché Perl è scritto in C, probabilmente entrambi i metodi effettuano la chiamata di sistema open(2). La differenza è che in open() Perl ha alcune sottigliezze integrate che rendono apertura, tubazioni e reindirizzamentomolto facile. Allo stesso tempo, però, open() toglie una certa flessibilità. Non ha nessuna delle funzionalità Fcntl disponibile in sysopen(), né ha la funzionalità di mascheramento.

La maggior parte delle situazioni richiede solo open().

+0

Potete fornire un esempio di 'Fcntl' e la funzionalità di mascheramento disponibile in' sysopen'? – lexer

+0

Qui ci sono alcuni grandi esempi di maschere: http://perldoc.perl.org/perlopentut.html#Permissions-agrave-la-mode, e la sezione nello stesso link appena sopra dove il link atterra ha grandi esempi di Funzionalità di 'Fcntl'. Questa sezione inizia con la frase "E qui ci sono cose che puoi fare con sysopen che non puoi fare con un open regolare". Godere! –

Problemi correlati