『壹』 open和fopen的區別
open和fopen的區別:
1.緩沖文件系統
緩沖文件系統的特點是:在內存開辟一個「緩沖區」,為程序中的每一個文件使用,當執行讀文件的操作時,從磁碟文件將數據先讀入內存「緩沖區」, 裝滿後再從內存「緩沖區」依此讀入接收的變數。執行寫文件的操作時,先將數據寫入內存「緩沖區」,待內存「緩沖區」裝滿後再寫入文件。由此可以看出,內存 「緩沖區」的大小,影響著實際操作外存的次數,內存「緩沖區」越大,則操作外存的次數就少,執行速度就快、效率高。一般來說,文件「緩沖區」的大小隨機器 而定。
fopen, fclose, fread, fwrite, fgetc, fgets, fputc, fputs, freopen, fseek, ftell, rewind等
2.非緩沖文件系統
緩沖文件系統是藉助文件結構體指針來對文件進行管理,通過文件指針來對文件進行訪問,既可以讀寫字元、字元串、格式化數據,也可以讀寫二進制數 據。非緩沖文件系統依賴於操作系統,通過操作系統的功能對文件進行讀寫,是系統級的輸入輸出,它不設文件結構體指針,只能讀寫二進制文件,但效率高、速度 快,由於ANSI標准不再包括非緩沖文件系統,因此建議大家最好不要選擇它。本書只作簡單介紹。open, close, read, write, getc, getchar, putc, putchar 等。
open 是系統調用 返回的是文件句柄,文件的句柄是文件在文件描述副表裡的索引,fopen是C的庫函數,返回的是一個指向文件結構的指針。
fopen是ANSIC標准中的C語言庫函數,在不同的系統中應該調用不同的內核api
linux中的系統函數是open,fopen是其封裝函數,個人觀點。僅供參考。
文件描述符是linux下的一個概念,linux下的一切設備都是以文件的形式操作.如網路套接字、硬體設備等。當然包括操作文件。
fopen是標准c函數。返迴文件流而不是linux下文件句柄。
設備文件不可以當成流式文件來用,只能用open
fopen是用來操縱正規文件的,並且設有緩沖的,跟open還是有一些區別
一般用fopen打開普通文件,用open打開設備文件
fopen是標准c里的,而open是linux的系統調用.
他們的層次不同.
fopen可移植,open不能
我認為fopen和open最主要的區別是fopen在用戶態下就有了緩存,在進行read和write的時候減少了用戶態和內核態的切換,而open則每次都需要進行內核態和用戶態的切換;表現為,如果順序訪問文件,fopen系列的函數要比直接調用open系列快;如果隨機訪問文件open要比fopen快。
來自論壇的經典回答:
前者屬於低級IO,後者是高級IO。
前者返回一個文件描述符(用戶程序區的),後者返回一個文件指針。
前者無緩沖,後者有緩沖。
前者與 read, write 等配合使用, 後者與 fread, fwrite等配合使用。
後者是在前者的基礎上擴充而來的,在大多數情況下,用後者。
『貳』 php執行linux命令並輸出終端屏幕顯示的內容(實時)
PHP在linux上執行命令
目錄:
一、PHP中調用外部命令介紹
二、關於安全問題
三、關於超時問題
四、關於PHP運行linux環境中命令出現的問題
一、PHP中調用外部命令介紹
在PHP中調用外部命令,可以用,1>調用專門函數、2>反引號、3>popen()函數打開進程,三種方法來實現:
方法一:用PHP提供的專門函數(四個):
PHP提供4個專門的執行外部命令的函數:exec(), system(), passthru(), shell_exec()
1)exec()
原型: string exec ( string $command [, array &$output [, int &$return_var ] )
說明: exec執行系統外部命令時不會輸出結果,而是返回結果的最後一行。如果想得到結果,可以使用第二個參數,讓其輸出到指定的數組。此數組一個記錄代表輸出的一行。即如果輸出結果有20行,則這個數組就有20條記錄,所以如果需要反復輸出調用不同系統外部命令的結果,最好在輸出每一條系統外部命令結果時清空這個數組unset($output),以防混亂。第三個參數用來取得命令執行的狀態碼,通常執行成功都是返回0。
<?php
exec("dir",$output);
print_r($output);
?>
2)system()
原型: string system ( string $command [, int &$return_var ] )
說明: system和exec的區別在於,system在執行系統外部命令時,它執行給定的命令,輸出和返回結果。第二個參數是可選的,用來得到命令執行後的狀態碼。
<?php
system("pwd",$result);
print $result;//輸出命令的結果狀態碼
?>
關於第二個參數結果狀態碼的簡單介紹:
如果返回0是運行成功,
在Bash中,當錯誤發生在致命信號時,bash會返回128+signal number做為返回值。
如果找不到命令,將會返回127。
如果命令找到了,但該命令是不可執行的,將返回126。
除此以外,Bash本身會返回最後一個指令的返回值。
若是執行中發生錯誤,將會返回一個非零的值。
Fatal Signal : 128 + signo
Can't not find command : 127
Can't not execute : 126
Shell script successfully executed : return the last command exit status
Fatal ring execution : return non-zero
3)passthru()
原型: void passthru ( string $command [, int &$return_var ] )
說明: passthru與system的區別,passthru直接將結果輸出到游覽器,不返回任何值,且其可以輸出二進制,比如圖像數據。第二個參數可選,是狀態碼。
<?php
header("Content-type:image/gif");
passthru("/usr/bin/ppm2tiff /usr/share/tk8.4/demos/images/teapot.ppm");
?>
4)shell_exec()
原型: string shell_exec ( string $cmd )
說明: 直接執行命令$cmd
<?php
$output = shell_exec('ls -lart');
echo "<pre>$output</pre>";
?>
方法二:反撇號
原型: 反撇號`(和~在同一個鍵)執行系統外部命令
說明: 在使用這種方法執行系統外部命令時,要確保shell_exec函數可用,否則是無法使用這種反撇號執行系統外部命令的。
<?php
echo `dir`;
?>
方法三:用popen()函數打開進程
原型: resource popen ( string $command , string $mode )
說明: 能夠和命令進行交互。之前介紹的方法只能簡單地執行命令,卻不能與命令交互。有時須向命令輸入一些東西,如在增加系統用戶時,要調用su來把當前用戶換到root用戶,而su命令必須要在命令行上輸入root的密碼。這種情況下,用之前提到的方法顯然是不行的。
popen( )函數打開一個進程管道來執行給定的命令,返回一個文件句柄,可以對它讀和寫。返回值和fopen()函數一樣,返回一個文件指針。除非使用的是單一的模式打開(讀or寫),否則必須使用pclose()函數關閉。該指針可以被fgets(),fgetss(),fwrite()調用。出錯時,返回FALSE。
<?php
error_reporting(E_ALL);
/* Add redirection so we can get stderr. */
$handle = popen('/path/to/executable 2>&1', 'r');
echo "'$handle'; " . gettype($handle) . "\n";
$read = fread($handle, 2096);
echo $read;
pclose($handle);
?>
『叄』 linux 中 open和fopen的區別
Linux中open與fopen區別如下:
1、來源
從來源的角度看,兩者能很好地區分開,這也是最顯而易見的區別:
①open是Unix系統調用函數,返回的是文件描述符,它是文件在文件描述符表裡的索引;
②fopen是ANSIC標准中的C語言庫函數,在不同的系統中應該調用不同的內核api。返回的是一個指向文件結構的指針。
2、移植性
這一點從上面的來源可以推斷出來,fopen是C標准函數,因此擁有良好的移植性,而open是Unix系統調用,移植性有限。如Windows下相似的功能使用API函數CreateFile。
3、適用范圍
①open返迴文件描述符,而文件描述符是Unix系統下的一個重要概念,Unix下的一切設備都是以文件的形式操作。如網路套接字、硬體設備等。當然包括操作普通正規文件。
②fopen是用來操縱普通正規文件。
4、文件IO層次
如果從文件IO的角度來看,前者屬於低級IO函數,後者屬於高級IO函數。低級和高級的簡單區分標準是:誰離系統內核更近。低級文件IO運行在內核態,高級文件IO運行在用戶態。
『肆』 linux socket 文件句柄是全局的嗎
不是。
在文件I/O中,要從一個文件讀取數據,應用程序首先要調用操作系統函數並傳送文件名,並選一個到該文件的路徑來打開文件。該函數取回一個順序號,即文件句柄(filehandle),該文件句柄對於打開的文件是唯一的識別依據。要從文件中讀取一塊數據,應用程序需要調用函數ReadFile,並將文件句柄在內存中的地址和要拷貝的位元組數傳送給操作系統。當完成任務後,再通過調用系統函數來關閉該文件。
『伍』 linux 中 open和fopen的區別
open 是系統調用抄 返回的是文件句柄,文襲件的句柄是文件在文件描述副表裡的索引,fopen是C的庫函數,返回的是一個指向文件結構的指針。
fopen是ANSIC標准中的C語言庫函數,在不同的系統中應該調用不同的內核api
linux中的系統函數是open,fopen是其封裝函數
open和fopen的區別:
1、open屬於低級IO,fopen是高級IO。
2、open返回一個文件描述符,fopen返回一個文件指針。
3、open無緩沖,fopen有緩沖。
4、open與 read, write 等配合使用, fopen與 fread, fwrite等配合使用。
5、fopen是在open的基礎上擴充而來的,在大多數情況下,用fopen。
『陸』 linux close命令
你是指C語言的庫函數 close 吧? 它是用來關閉文件的,它的參數是調用 open 函數或者 create 函數成功後返回的文件句柄,是一個整型變數。用 close 的時候需要
#include <unistd.h>
舉例子:
/**************************** 源文件 eg.c ***********************************/
#include <sys/types.h>
#include <sys/stat.h>
#include <fnct.h>
/* 以上是調用 open 函數所需的頭文件 */
#include <unistd.h>
int main(int argc, char **argv) {
int fd;
if (argc == 1) {
沒有文件名,報錯,或者提供一個默認的文件名;
}
fd = open(argv[1], O_RDWR);
if(fd < 0) {
打開失敗,報錯,退出;
}
/* 成功打開文件之後 */
各種操作;
close(fd);
return(0);
}
『柒』 linux C裡面的write函數的第一個參數是怎麼判斷的
1 是標准輸出 (屏幕)
2 是標准錯誤輸出 (屏幕)
0 是標准輸入 (鍵盤)
這三個是系統定製的,程序啟動後,默認打開的,不需要專門open()。
『捌』 Linux之文件句柄
ulimit:
1,查看進程允許打開的最大文件句柄數
ulimit -n
2,設置進程能打開的最大文件句柄數
ulimit -n xxx
-H 指定資源的硬限制
-S 指定資源的軟限制
hard 代表當前硬限制
soft 代表當前軟體限制
unlimited 代表不限制.
3, 文件限制配置文件
/etc/security/limits.conf
4,文件句柄最大數據配置
配置文件:/proc/sys/fs/file-max
這個參數的默認值和內存大小有關系,可以使用公式:file-max 內存大小/ 10k.
4.1 建議將整個系統的文件句柄值至少設置為 65536
4.2 echo "65536" > /proc/sys/fs/file-max
4.3 sysctl -w fs.file-max=65536
4.4 echo "fs.file-max=65536" >> /etc/sysctl.conf
5,文件句柄使用情況配置文件:/proc/sys/fs/file-nr
這三個值分別指:系統已經分配出去的句柄數、已經分配但是還沒有使用的句柄數以及系統最大的句柄數(和file-max一樣)。
6,查看進程打開的文件句柄數
lsof:列出當前系統打開文件的工具。