❶ 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]='