10.29.2015

Linux C dup()

dup()和dup2()的用法,就某種程度上而言很類似;但dup()比較難懂,而且dup()比較適用於pipe()-fd[0]-read();fd[1]-write()也是可以用啦!! 但並沒有太大的意義

硬是要比較的話,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()

沒有留言:

張貼留言