硬是要比較的話,dup()和dup2()對FD的操作,也比較像是主動式和被動式。刻意把這兩個範例寫得非常類似,以方便做比較。
功能說明:複製FD。
標頭檔:#include <unistd.h>
函式宣告:int dup(int oldfd);
函式說明:dup()用來複製引數oldfd所指的FD,並將它傳回。此新的FD和引數oldfd指的是同一個檔案,共享所有的鎖定、讀寫位置和各項權限或旗標。
回傳值:當複製成功時,則傳回最小及尚未使用的FD;若有錯誤則傳回-1。
範例:
// dup.c #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> #include <strings.h> #include <sys/types.h> int main() { pid_t pid = 1; int fd[2], nRet = 0; char szSend[16], szRecv[32]; bzero((void *)&fd, sizeof(int) * 2); if (pipe(fd) != 0) { perror("Create pipe() failed (error)!! \n"); exit(EXIT_FAILURE); } // printf("fd[0] = %d; fd[1] = %d \n", fd[0], fd[1]); memset(&szSend, '\0', sizeof(char) * 16); pid = fork(); if (pid == 0) { close(STDIN_FILENO); close(STDOUT_FILENO); dup(fd[1]); // Need, or not?? close(fd[0]); // close(fd[1]); strcpy(szSend, "Hello!! "); write(fd[1], (void *)szSend, strlen(szSend)); /* Why can't use STDOUT_FILENO instead of fd[1]?? */ close(fd[1]); exit(EXIT_SUCCESS); } waitpid(-1, &nRet, NULL); close(STDIN_FILENO); dup(fd[0]); // close(STDOUT_FILENO); // Don't close it!! close(fd[0]); close(fd[1]); memset(&szRecv, '\0', sizeof(char) * 32); read(STDIN_FILENO, (void *)szRecv, sizeof(char) * 32); strcat(szRecv, "World!! "); printf("szRecv: %s (%d) \n", szRecv, strlen(szRecv)); return 0; }執行結果:
[root@localhost ~]# ./dup
szRecv: Hello!! World!! (16)
[root@localhost ~]#
相關文章:Linux C dup2()
沒有留言:
張貼留言