硬是要比較的話,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()
沒有留言:
張貼留言