1. linux下c語言編程,管道,p,fork,疑問的是,為什麼連用那麼多close必須要close 代碼如下
文件描述符0,1,2分別表示標准輸入標准輸出,標准錯誤輸出, 所以在子進程里close(1)是關閉了標准輸出, 然後用p(fda[1]);此時未用的最小文件描述符就是1(被關閉);這里關閉fda[0]就是為了說明在子進程是管道的寫端(fda[0],不關閉是可以的為了保險起見關閉).然後子進程退出會調用系統程序ls,於是當前的文件目錄就被發送到管道中.父進程同理, 就是將標准輸出作為管道的讀端,它讀到的是子進程ls後的內容,對文件計數,
2. 匯編中DUP和EQU指令的含義是什麼
EQU,顧名思義,就是等於的意思,例如:
MY_AGE
EQU
26
意思就是說,「MY_AGE」就代表26,以後可以在程序中使用這個名字。
MOV
A,
MY_AGE
;
A=26.
DUP,
意為分配內存空間。
MY_MEMORY
DB
20
DUP(0)
意思就是分配一個內存空間,開始地址為「MY_MEMORY」,大小為20位元組(DB
20),每一個位元組都初始化為「0」。
3. 匯編語言中DA1 DB 04H DUP(3 DUP(2),2 DUP(3))什麼意思
DUP(3 DUP (2), 2 DUP (3))這是個DUP的 "嵌套「。
1、DUP指令的用法是: count DUP (表達式,表達式,表達式,...)。
2、p它有多種意義,包括Linux c 函數、C語言函數DUP、匯編指令、化學物質DUP。
3、由p返回的新文件描述符一定是當前可用文件描述中的最小數值。用p2則可以用fd2參數指定新的描述符數值。
4、如果fd2已經打開,則先關閉。若fd1=fd2,則p2返回fd2,而不關閉它。通常使用這兩個系統調用來重定向一個打開的文件描述符。
4. c語言的 p函數
int _p( int handle ); 為一個已經打開的文件建立第二個句柄。
下面的例子中給已經有句柄的標准輸出設備(stdout)建立第二個句柄Monitor ,然後再恢復原來的句柄:
int Monitor; Monitor = _p(1); ...... _p2(Monitor,1);
新建的和原有的句柄指的是同一個文件(或設備),該函數不具備關閉文件的功能,因此還需手動關閉。
5. C語言中p和p2函數的不同和使用
p返回的新文件描述符一定是當前可以用描述符中的最小值。下面先打開一個文件來看下文件描述符,為保證測試成功,創建一個測試文件log.txt。
1
2
3
4
5
6
7
8
9
10
11
12
#include <fcntl.h>
#include <stdio.h>
int main(int argc, char *argv[])
{
int fd;
fd = open("./log.txt", O_RDWR);
printf("%d\n", fd);
return 0;
}
上面的代碼用讀寫打開了log.txt這個文件,編譯上面的代碼然後執行,執行成功的話,應當是輸出3,因為0,1,2分別被標准輸入,標准輸出,標准錯誤輸出佔用了。使用p復制這個文件描述符,並嘗試移動fd偏移量:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <unistd.h>
#include <fcntl.h>
#include <stdio.h>
int main(int argc, char *argv[])
{
int fd, fd;
fd = open("./log.txt", O_RDWR);
//復制fd
fd = p(fd);
//輸出fd,應當為4
printf("%d\n", fd);
//列印出fd和fd的偏移量,都為0
printf("%d\n", (int)lseek(fd, 0, SEEK_CUR));
printf("%d\n", (int)lseek(fd, 0, SEEK_CUR));
//將fd的偏移量+3
lseek(fd, 3, SEEK_SET);
//列印出fd和fd的偏移量,都為3
printf("%d\n", (int)lseek(fd, 0, SEEK_CUR));
printf("%d\n", (int)lseek(fd, 0, SEEK_CUR));
return 0;
}
編譯執行上例代碼可以發現當移動fd的偏移量時,fd的偏移量也發生了變化。往文件里寫入內容試試,先把log.txt內容清空。
6. C語言fflush(stdin)函數是什麼意思,在什麼情況下用它
1、fflush(stdin)是清空輸入緩沖區的意思。stdin就是標准輸入 std即standard(標准),in即input(輸入),合起來就是標准輸入。 一般就是指鍵盤輸入到緩沖區里的東西。
2、在清除文件緩沖區時使用,文件以寫方式打開時將緩沖區內容寫入文件。
例:
#include <conio.h>
#include <io.h>
#include <stdio.h>
#include <string.h>
void flush(FILE *stream);
int main(void)
{
FILE *stream;
char msg[] = "This is a test";
/* create a file */
stream = fopen("DUMMY.FIL", "w");
/* write some data to the file */
fwrite(msg, strlen(msg), 1, stream);
clrscr();
printf("Press any key to flush DUMMY.FIL:");
getch();
/* flush the data to DUMMY.FIL without closing it */
flush(stream);
printf(" File was flushed, Press any key to quit:");
getch();
return 0;
}
void flush(FILE *stream)
{
int phandle;
/* flush the stream's internal buffer */
fflush(stream);
/* make a plicate file handle */
phandle = p(fileno(stream));
/* close the plicate handle to flush the DOS buffer */
close(phandle);
}
(6)c語言p擴展閱讀
使用fflush的注意事項
1、MSDN 文檔里也清楚地寫著:fflush on input stream is an extension to the C standard (fflush 操作輸入流是對C標準的擴充)。以下是 C99 對 fflush 函數的定義:int fflush(FILE *stream);
2、如果stream指向輸出流或者更新流(update stream),並且這個更新流最近執行的操作不是輸入,那麼fflush函數將把任何未被寫入的數據寫入stream指向的文件(如標准輸出文件stdout)。
3、fflush函數的行為是不確定的。fflush(NULL)清空所有輸出流和上面提到的更新流。如果發生寫錯誤,flush函數會給那些流打上錯誤標記,並且返回EOF,否則返回0。
4、如果 stream 指向輸入流(如 stdin),那麼 fflush 函數的行為是不確定的。故而使用 fflush(stdin) 是不正確的。
7. C語言 fflush(stdin)是什麼意思
清空輸入緩沖區。
scanf("%d",&a);
scanf("%c",&c);
經常如果這種情況的話,第一次輸入的回車可能會被第二次輸入操作所捕捉,這個的作用就是清空緩沖,這樣就不會出現這種情況了。
8. c語言p2(socket,0)是什麼意思
復制描述符,就是把socket復製成0,對0的讀寫就是對socket的讀寫。