導航:首頁 > 操作系統 > linuxdupdup2

linuxdupdup2

發布時間:2022-07-29 21:19:34

❶ 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內容清空。

linux 下 pipe()與p2 問題

#include<stdio.h>

#include<unistd.h>

intmain()
{
intfd[2];

pipe(fd);

if(fork()==0){
close(fd[0]);
p2(fd[1],STDOUT_FILENO);
close(fd[1]);

printf("Hello");
printf("123");
printf("ooppqq");

}else{
close(fd[1]);
#defineBUFFER_SIZE1024
charbuffer[BUFFER_SIZE];
intreadCount;

while((readCount=read(fd[0],buffer,
BUFFER_SIZE-1))>0){
buffer[readCount]='';
printf(buffer);
}
close(fd[0]);
}

return0;
}

❸ 使用p2重定向了標准輸出後,使用什麼方法恢復對終端的輸出

使用p進行輸入輸出重定向後,文件描述符1和0原來指向鍵盤和屏幕,後來指向了文件;如果要將0和1恢復指向鍵盤和屏幕,可以事先使用p2或p用其他文件描述符來指向鍵盤和屏幕,然後再掉用p2或p恢復過來

❹ 怎麼利用p和p2執行系統調用

系統屬性-高級系統設置-性能-設置-數據執行保護中選"為除下列選定程序之外的所有程序和服務啟用DEP(U)",點"添加",彈出的對話框中定位於C:\windows\system32\dllhost,點"打開",一路確定關閉對話框,重啟計算機。

❺ linux p2()函數怎麼不能重定向標准輸出(STDOUT)到文件

我沒怎麼改,編譯運行好像正常?
#include<stdio.h>
#include<unistd.h>

int main(int argc,char **argv)
{
FILE * fd;

fd = fopen("log.txt","a+");

p2(fileno(fd), 1);
p2(fileno(fd), 2);

int i=0;
for(i=0;i<5;i++)
{
printf("output to STDOUT!\n");
fprintf(stderr,"output to STDERR!\n");
sleep(2);
}

return 0;
}

結果:

[ksl@myhost ~]$ cat log.txt
output to STDERR!
output to STDERR!
output to STDERR!
output to STDERR!
output to STDERR!
output to STDOUT!
output to STDOUT!
output to STDOUT!
output to STDOUT!
output to STDOUT!

先輸出了stderr的原因是,stdout在sleep之後不會立刻輸出,而是等到進程要關閉的時候,所以之前每次都會先輸出STDERR,等到進程結束的時候才把stdout的內容給刷出來。我這邊顯示是這樣的。

❻ Linux 為什麼復制的文件一直增加p後綴

p函數只有一個參數,也就是輸入一個fd,可是沒有另外一個參數說,要把這個fd復制給誰?
下面這個小程序,調用fd的結果是,打開的一個文件fd被復制到了標准輸出,以至於execl調用的列印內容,被重定向到了文件當中。

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/stat.h>
int main(void){
int filedes;
if((filedes=open("dd.txt",O_WRONLY|O_CREAT,S_IRUSR|S_IWUSR))<0)
fprintf(stderr,"%s ","open file error");
close(1);
p(filedes);
close(filedes);
execlp("ls","-l",(char * )0);
return 0;
}

所以看起來p程序就是要復制一個fd到stdout。是這樣的嗎,如果我要p到stdout以外的fd怎麼辦呢?
------解決思路----------------------
p返回的是當前最小可用描述符,你這里會重定向到標准輸出是因為你close(1),使標准輸出描述符可以被用,所以p返回了1.
如果我要p到stdout以外的fd,使用p2

❼ 求linux命令 列印文本文件內容到控制台 多個文件可以左右分欄列印, 我記得有這么一個命令,想不起來了

最簡單的你 a.out >> 1.txt

或者用p2,重定向。
你首先要搞清楚控制台上的輸出是怎麼輸出的,比如說是程序裡面printf出來的, 腳本裡面echo出來的等等。
然後做一個寫日誌的函數代碼那個輸出。也可以把標准輸出的文件描述符p到你要寫的文件上面。
最簡單的你 a.out >> 1.txt

或者用p2,重定向。
函數執行,產生的標准輸出,已經再控制台了,我再把它重定向。
你首先要搞清楚控制台上的輸出是怎麼輸出的,比如說是程序裡面printf出來的, 腳本裡面echo出來的等等。
然後做一個寫日誌的函數代碼那個輸出。也可以把標准輸出的文件描述符p到你要寫的文件上面。
execvp(args[0], args) 這個函數運行產生的結果。
使用命令重定向操作符可以使用重定向操作符將命令輸入和輸出數據流從默認位置重定
向到不同的位置。輸入或輸出數據流的位置即為句柄。

下表將列出可用的句柄。

句柄 句柄的數字代號 描述
STDIN 0 鍵盤輸入
STDOUT 1 輸出到命令提示符窗口
STDERR 2 錯誤輸出到命令提示符窗口
UNDEFINED 3-9 這些句柄由應用程序單獨定義,並且是各個工具特定的。

數字 0 到 9 代表前 10 個句柄。可以使用命令 Cmd.exe 運行程序並將該程序前 10 個
句柄中的任何一個重定向。要指定想使用的句柄,可在重定向操作符前面鍵入該句柄的
數字。如果未定義句柄,則默認的 < 重定向輸入操作符是 0,而默認的 > 重定向輸出
操作符是 1。鍵入 > 或 < 操作符之後,必須指定要讀取或寫入數據的位置。可以指定
文件名或另一個現有的句柄。

要指定重定向到現有句柄,請使用與 (&) 字元,後面接要重定向的句柄號
(例如 &句柄#)。例如,下面的命令可以將句柄 2(即 STDERR)重定向到
句柄 1(即 STDOUT):

2>&1

下表列出了可用於將輸入和輸出數據流進行重定向的操作符。

重定向操作符 描述
> 將命令輸出寫入到文件或設備(例如列印機)中,而不是寫在命令提示符窗口或句柄中。
< 從文件中而不是從鍵盤或句柄中讀入命令輸入。
>> 將命令輸出添加到文件末尾而不刪除文件中的信息。
>& 將一個句柄的輸出寫入到另一個句柄的輸入中。
<& 從一個句柄讀取輸入並將其寫入到另一個句柄輸出中。
| 從一個命令中讀取輸出並將其寫入另一個命令的輸入中。也稱作管道。

默認情況下,可以從鍵盤將命令輸入(即 STDIN 句柄)發送到 Cmd.exe,然後由
Cmd.exe 將命令輸出(即 STDOUT 句柄)發送到命令提示符窗口。

重定向輸入 (<)
要將鍵盤輸入重定向到文件或設備,請使用 < 操作符。例如,要從 File.txt 獲取
sort 命令的輸入,請鍵入:

sort<file.txt

File.txt 的內容將以字母順序列表的方式顯示在命令提示符窗口中。

< 操作符可以打開具有隻讀訪問的指定文件名。所以,不能使用該操作符向文件中寫入
信息。例如,如果以 <&2 啟動程序,則所有試圖讀取句柄 0 的操作都將失敗,因為句
柄 2 最初是以只寫訪問打開的。

注意

0 是 < 重定向輸入操作符的默認句柄。
重定向輸出 (>)
幾乎所有的命令都將輸出發送到命令提示符窗口。即使將輸出發送到驅動器或列印機的
命令也會在命令提示符窗口顯示消息和提示。

要將輸出從命令提示符窗口重定向到文件或設備,請使用 > 操作符。可以在許多命令中
使用該操作符。例如,要將 dir 輸出重定向到 Dirlist.txt,請鍵入:

dir>dirlist.txt

如果 Dirlist.txt 不存在,Cmd.exe 將創建該文件。如果 Dirlist.txt 存在,Cmd.exe
將使用 dir 命令的輸出替換文件中的信息。

要運行 netsh routing mp 命令,然後將輸出發送到 Route.cfg,請鍵入:

netsh routing mp>c:\route.cfg

> 操作符可以打開具有隻寫訪問屬性的指定文件。所以,不能使用該操作符讀取文件。
例如,如果使用重定向 >&0 啟動程序,則所有試圖寫入句柄 1 的操作都將失敗,因為
句柄 0 最初是以只讀訪問打開的。

注意

1 是 > 重定向輸出操作符的默認句柄。
復制句柄
重定向操作符 & 可以將輸出或輸入從一個指定句柄復制到另一個指定的句柄。例如,
要將 dir 輸出發送到 File.txt 並將錯誤輸出發送到 File.txt,請鍵入:

dir>c:\file.txt 2>&1

復制句柄時,可以復制該句柄原狀態的所有特性。例如,如果一個句柄具有隻寫訪問的
屬性,則該句柄的所有副本都具有隻寫訪問屬性。不能將一個具有隻讀訪問屬性的句柄
復制到另一個具有隻寫訪問屬性的句柄。

使用 & 操作符重定向輸入和副本
要將重定向輸入操作符 (<) 與復制操作符 (&) 一起使用,指定的文件必須已經存在。
如果輸入文件存在,Cmd.exe 將以只讀方式打開該文件,然後將文件中包含的字元作為
輸入發送到此命令(如同從鍵盤輸入一樣)。如果指定了句柄,Cmd.exe 將指定的句柄
復制到系統現有的句柄中。

例如,要以句柄 0 輸入讀取(即 STDIN)的方式打開 File.txt,請鍵入:

<file.txt

要打開 File.txt,並在內容排序後將輸出發送到命令提示符窗口(即 STDOUT),請鍵入:

sort<file.txt

要查找 File.txt,然後將句柄 1(即 STDOUT)和句柄 2(即 STDERR)重定向到
Search.txt,請鍵入:

findfile file.txt>search.txt 2<&1

要以句柄 0 輸入讀取(即 STDIN)的方式復制用戶定義句柄 3,請鍵入:

<&3

使用 & 操作符重定向輸出和復制
如果將輸出重定向到文件且指定了現有的文件名,Cmd.exe 將以只寫方式打開文件並覆
蓋該文件內容。如果指定了句柄,Cmd.exe 將文件復制到現有句柄中。

要將用戶定義句柄 3 復制到句柄 1,請鍵入:

>&3

要將包括句柄 2(即 STDERR)的所有輸出從 ipconfig 命令重定向到
句柄 1(即 STDOUT),然後將輸出重定向到 Output.log,請鍵入:

ipconfig.exe>>output.log 2>&1

使用 >> 重定向操作符追加輸出
要從命令中將輸出添加到文件末尾而不丟失文件中已存在的任何信息,請使用兩個連續
的大於號(即 >>)。例如,下面的命令可以將由 dir 命令生成的目錄列表追加到
Dirlist.txt 文件:

dir>>dirlist.txt

要將 netstat 命令的輸出追加到 Tcpinfo.txt 的末尾,請鍵入:

netstat>>tcpinfo.txt

使用管道操作符 (|)
管道操作符 (|) 可以提取一個命令的輸出(默認情況下是 STDOUT),然後將其導入另
一個命令的輸入中(默認情況下是 STDIN)。例如,下面的命令將對目錄分類:

dir | sort

在本例中,將同時啟動兩個命令,但隨後 sort 命令會暫停,直到它接收到 dir 命令
的輸出為止。sort 命令使用 dir 命令的輸出作為輸入,然後將輸出發送到
句柄 1(即 STDOUT)。

合並帶重定向操作符的命令
可以通過合並帶有其他命令和文件名的篩選器命令創建自定義命令。例如,可以使用以
下命令存儲包含「LOG」字元串的文件名:

dir /b | find "LOG" > loglist.txt

dir 命令的輸出通過 find 篩選器命令發送。包含字元串 "LOG" 的文件名作為文件名
列表(例如,NetshConfig.log、Logdat.svd 和 Mylog.bat)存儲在文件
Loglist.txt 中。

要在相同命令中使用多個篩選器,請使用管道 (|) 分隔篩選器。例如,下面的命令將
搜索 C 盤上的每個目錄以查找包含 "LOG" 字元串的文件名,並且在命令提示符窗口中
每次顯示一屏:

dir c:\ /s /b | find "LOG" | more

利用管道 (|) 可以將 Cmd.exe 導向為通過 find 篩選器命令發送 dir 命令輸出。
find 命令只選擇包含字元串 "LOG" 的文件名。more 命令可以顯示由 find 命令選擇
的文件名(在命令提示符窗口中每次顯示一屏)。有關篩選器命令的詳細信息,請參閱
使用篩選器。

❽ linux的p是復制文件描述字還是代替

其實就是這樣:
p()或者p2()主要是將某個特定的文件描述字輸出輸出的重定向!
他們保證將復制的文件描述字到當前未打開的最小描述字!事例代碼int fd;if(argc!=2){err_quit("Usage :filename");}if((fd=creat(argv[1],0644))

閱讀全文

與linuxdupdup2相關的資料

熱點內容
於謙聊天哪個app 瀏覽:447
小鵬汽車nlp演算法工程師薪資 瀏覽:879
代碼加密與隱藏 瀏覽:641
fordfulkerson演算法 瀏覽:350
京東熱app在哪裡可以下載 瀏覽:874
彩報圖書app哪個好 瀏覽:301
新君威20壓縮比 瀏覽:186
手機php整站 瀏覽:915
windows路由跳轉命令 瀏覽:472
量子遺傳演算法程序 瀏覽:222
各編程語言自帶軟體庫 瀏覽:184
編程最少學習多少 瀏覽:403
禪海蠡測語譯pdf 瀏覽:189
伺服器如何設置主城領地 瀏覽:122
android後台發送簡訊 瀏覽:5
mql4編程下載 瀏覽:954
為什麼演算法都用包 瀏覽:190
androidnfc測試 瀏覽:185
孫宇晨演算法 瀏覽:388
安卓11更新內容怎麼刪除 瀏覽:929