dup它有多種意義,包括Linux c 函數(shù)、C語(yǔ)言函數(shù)DUP、匯編指令、化學(xué)物質(zhì)DUP。
創(chuàng)新互聯(lián)公司公司2013年成立,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目成都網(wǎng)站建設(shè)、成都網(wǎng)站制作網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個(gè)夢(mèng)想脫穎而出為使命,1280元德陽(yáng)做網(wǎng)站,已為上家服務(wù),為德陽(yáng)各地企業(yè)和個(gè)人服務(wù),聯(lián)系電話:18982081108
C語(yǔ)言函數(shù)DUP
函數(shù)簡(jiǎn)介
函數(shù)名: _dup
功 能: 復(fù)制一個(gè)文件句柄
用 法: int _dup(int handle);
相關(guān)函數(shù):_dup2、fdopen、freopen、_mbsdup、_wcsdup、_strdup
擴(kuò)展資料:
匯編指令
dup 在匯編中是一條偽指令,用來(lái)重復(fù)初始化數(shù)據(jù)
用法舉例:
str1 db 10 dup ('!@#') ;這就是十個(gè)!@#
格式:db 重復(fù)的次數(shù) dup (重復(fù)的內(nèi)容)
化學(xué)物質(zhì)DUP
DUP是1,2-苯二甲酸二正十一酯,不溶于水,主要是作為增塑劑來(lái)使用的,溶于酯類。
參考資料??百度百科-DUP
文件描述符0,1,2分別表示標(biāo)準(zhǔn)輸入標(biāo)準(zhǔn)輸出,標(biāo)準(zhǔn)錯(cuò)誤輸出, 所以在子進(jìn)程里close(1)是關(guān)閉了標(biāo)準(zhǔn)輸出, 然后用dup(fda[1]);此時(shí)未用的最小文件描述符就是1(被關(guān)閉);這里關(guān)閉fda[0]就是為了說(shuō)明在子進(jìn)程是管道的寫端(fda[0],不關(guān)閉是可以的為了保險(xiǎn)起見(jiàn)關(guān)閉).然后子進(jìn)程退出會(huì)調(diào)用系統(tǒng)程序ls,于是當(dāng)前的文件目錄就被發(fā)送到管道中.父進(jìn)程同理, 就是將標(biāo)準(zhǔn)輸出作為管道的讀端,它讀到的是子進(jìn)程ls后的內(nèi)容,對(duì)文件計(jì)數(shù),
用途:不掛斷地運(yùn)行命令。
語(yǔ)法:nohup Command [ Arg … ] [ ]
無(wú)論是否將 nohup 命令的輸出重定向到終端,輸出都將附加到當(dāng)前目錄的 nohup.out 文件中。
如果當(dāng)前目錄的 nohup.out 文件不可寫,輸出重定向到 $HOME/nohup.out 文件中。
如果沒(méi)有文件能創(chuàng)建或打開(kāi)以用于追加,那么 Command 參數(shù)指定的命令不可調(diào)用。
退出狀態(tài):該命令返回下列出口值:
126 可以查找但不能調(diào)用 Command 參數(shù)指定的命令。
127 nohup 命令發(fā)生錯(cuò)誤或不能查找由 Command 參數(shù)指定的命令。
否則,nohup 命令的退出狀態(tài)是 Command 參數(shù)指定命令的退出狀態(tài)。
用途:在后臺(tái)運(yùn)行
一般兩個(gè)一起用
3.為什么呢 21 要寫在后面?
首先是command file將標(biāo)準(zhǔn)輸出重定向到file中, 21 是標(biāo)準(zhǔn)錯(cuò)誤拷貝了標(biāo)準(zhǔn)輸出的行為,也就是同樣被重定向到file中,最終結(jié)果就是標(biāo)準(zhǔn)輸出和錯(cuò)誤都被重定向到file中。
21 標(biāo)準(zhǔn)錯(cuò)誤拷貝了標(biāo)準(zhǔn)輸出的行為,但此時(shí)標(biāo)準(zhǔn)輸出還是在終端。file 后輸出才被重定向到file,但標(biāo)準(zhǔn)錯(cuò)誤仍然保持在終端。
用strace可以看到:
這個(gè)命令中實(shí)現(xiàn)重定向的關(guān)鍵系統(tǒng)調(diào)用序列是:
open(file) == 3
dup2(3,1)
dup2(1,2)
這個(gè)命令中實(shí)現(xiàn)重定向的關(guān)鍵系統(tǒng)調(diào)用序列是:
dup2(1,2)
open(file) == 3
dup2(3,1)
注意:0 是標(biāo)準(zhǔn)輸入(STDIN),1 是標(biāo)準(zhǔn)輸出(STDOUT),2 是標(biāo)準(zhǔn)錯(cuò)誤輸出(STDERR)。
這里的2和之間不可以有空格,2是一體的時(shí)候才表示錯(cuò)誤輸出。
在linux中,我們需要復(fù)制文件描述符,下面是我對(duì)文件描述符的理解
int dup(int fd); // 復(fù)制一個(gè)已經(jīng)存在的文件描述符,如果成功,返回復(fù)制成功后的文件描述符,失敗返回-1
int dup(int fd, int fd2); // 復(fù)制一個(gè)文件描述符,fd表示已經(jīng)存在的打開(kāi)的文件描述符,fd2是指定新的文件描述符,如果fd2等于fd,則直接返回,如果fd2存在并且打開(kāi),則先close(fd2)后,重新打開(kāi),這樣fd2和fd就指向了同一個(gè)文件(共享打開(kāi)的文件),如果fd2不存在或者沒(méi)有打開(kāi),則打開(kāi)fd2,并且指向fd所指向的文件。函數(shù)的返回值和fd2一致。該函數(shù)可以實(shí)現(xiàn)文件的重定位。
每個(gè)進(jìn)程都有一個(gè)文件描述符表,每個(gè)描述符占用一個(gè)描述符項(xiàng),每個(gè)文件描述符可以描述成這樣
struct fileDescription {
int index;
void *pointer;
};
除了整形,還有一個(gè)指針,指向文件表,內(nèi)核為所有打開(kāi)文件維持一張文件表,每個(gè)文件表項(xiàng)包含:
1)文件狀態(tài)標(biāo)志(讀、寫、添寫、同步和非阻塞等)
2)當(dāng)前文件的偏移量
3)指向該文件v節(jié)點(diǎn)表項(xiàng)的指針
v節(jié)點(diǎn)表中包含了文件所有者、文件長(zhǎng)度、文件所在的設(shè)備、指向文件實(shí)際數(shù)據(jù)塊在磁盤上所在位置的指針等等
下面給出一個(gè)例子:
#include iostream
#include stdio.h
#include fcntl.h
#include sys/stat.h
#include unistd.h
#include string.h
using namespace std;
int main()
{
cout "Hello world!" endl;
int fd = open("a.txt", O_RDWR | O_CREAT | O_APPEND, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH);
if (fd 0)
{
printf("open a.txt failed, fd = %d\n", fd);
return -1;
}
printf("open a.txt success, fd = %d\n", fd);
fflush(stdout);
// 復(fù)制標(biāo)準(zhǔn)輸出的文件描述符
int nfd = dup(STDOUT_FILENO);
int fileFd = dup2(fd, STDOUT_FILENO);
if (fileFd 0)
{
printf("dup2 stdout_fileno failed, fileFd = %d\n", fileFd);
return -1;
}
printf("重定向標(biāo)準(zhǔn)輸出到a.txt, fileFd = %d\n", fileFd);
// 將STDOUT_FILENO復(fù)制到fd后,fd并沒(méi)有發(fā)生變化,依然可以通過(guò)它寫入到a.txt中
const char *pStr = "write string through fd\n";
write(fd, pStr, strlen(pStr));
fileFd = dup2(nfd, fileFd);
if (fileFd 0)
{
printf("dup2 reback stdout_fileno failed\n");
return -1;
}
printf("print back to stdout standard, fileFd = %d\n", fileFd);
// 上面使用dup2的時(shí)候,STDOUT_FILENO是存在并打開(kāi)的,我們來(lái)測(cè)試下不存在的文件描述符的情況
fileFd = dup2(fd, 20);
if (fileFd 0)
{
printf("dup2不存在的文件描述符失敗, fileFd = %d\n", fileFd);
}
else
{
printf("dup2不存在的文件描述符成功, fileFd = %d\n", fileFd);
const char *pStr = "write string through fileFd\n";
write(fileFd, pStr, strlen(pStr));
}
close(nfd);
close(fileFd);
return 0;
}
文件指針是關(guān)鍵,標(biāo)志兩個(gè)文件描述符是否一致,看文件指針是否一致即可 ,如果兩個(gè)或者多個(gè)文件描述符指向同一個(gè)文件表,那么對(duì)他們的操作是對(duì)同一個(gè)文件進(jìn)行操作