国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

《TCP/IP網(wǎng)絡(luò)編程》閱讀筆記--進(jìn)程間通信

這篇具有很好參考價(jià)值的文章主要介紹了《TCP/IP網(wǎng)絡(luò)編程》閱讀筆記--進(jìn)程間通信。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

目錄

1--進(jìn)程間通信

2--pipe()函數(shù)

3--代碼實(shí)例

3-1--pipe1.c

3-2--pipe2.c

3-3--pipe3.c

3-4--保存信息的回聲服務(wù)器端


1--進(jìn)程間通信

? ? ? ? 為了實(shí)現(xiàn)進(jìn)程間通信,使得兩個(gè)不同的進(jìn)程間可以交換數(shù)據(jù),操作系統(tǒng)必須提供兩個(gè)進(jìn)程可以同時(shí)訪問(wèn)的內(nèi)存空間;

? ? ? ? 為了完成進(jìn)程間通信,需要?jiǎng)?chuàng)建管道(pipe);管道并非屬于進(jìn)程的資源,而是屬于操作系統(tǒng);

2--pipe()函數(shù)

#include <unistd.h>
int pipe(int filedes[2]);
// 成功時(shí)返回0,失敗時(shí)返回-1
// filedes[0] 通過(guò)管道接收數(shù)據(jù)時(shí)使用的文件描述符,即管道出口
// filedes[1] 通過(guò)管道傳輸數(shù)據(jù)時(shí)使用的文件描述符,即管道入口

3--代碼實(shí)例

3-1--pipe1.c

? ? ? ? 子進(jìn)程從管道入口寫(xiě)數(shù)據(jù),父進(jìn)程從管道出口讀數(shù)據(jù);

// gcc pipe1.c -o pipe
// ./pipe

#include <stdio.h>
#include <unistd.h>
#define BUF_SIZE 30

int main(int argc, char *argv[]){
    int fds[2];
    char str[] = "Who are you?";
    char buf[BUF_SIZE];
    __pid_t pid;

    pipe(fds); // 創(chuàng)建管道
    pid = fork();
    if(pid == 0){ // 子進(jìn)程執(zhí)行區(qū)域
        write(fds[1], str, sizeof(str)); // 向管道入口寫(xiě)數(shù)據(jù)
    }
    else{ // 父進(jìn)程執(zhí)行區(qū)域
        read(fds[0], buf, BUF_SIZE); // 向管道出口讀數(shù)據(jù)
        puts(buf);
    }
    return 0;
}

《TCP/IP網(wǎng)絡(luò)編程》閱讀筆記--進(jìn)程間通信,網(wǎng)絡(luò)編程筆記,tcp/ip

3-2--pipe2.c

? ? ? ? 利用一個(gè)管道實(shí)現(xiàn)父進(jìn)程與子進(jìn)程的雙向通信;

// gcc pipe2.c -o pipe2
// ./pipe2

#include <stdio.h>
#include <unistd.h>
#define BUF_SIZE 30

int main(int argc, char *argv[]){
    int fds[2];
    char str1[] = "Who are you?";
    char str2[] = "Thank you for your message";
    char buf[BUF_SIZE];
    __pid_t pid;

    pipe(fds); // 創(chuàng)建管道
    pid = fork();
    if(pid == 0){ // 子進(jìn)程執(zhí)行區(qū)域
        write(fds[1], str1, sizeof(str1)); 
        sleep(2); // sleep的作用是防止子線程寫(xiě)的數(shù)據(jù)被子線程自身讀取了,導(dǎo)致父進(jìn)程一直等待
        read(fds[0], buf, BUF_SIZE);
        printf("Child proc output: %s \n", buf);
    }
    else{ // 父進(jìn)程執(zhí)行區(qū)域
        read(fds[0], buf, BUF_SIZE); 
        printf("Parent proc output: %s \n", buf);
        write(fds[1], str2, sizeof(str2));
        sleep(3);
    }
    return 0;
}

《TCP/IP網(wǎng)絡(luò)編程》閱讀筆記--進(jìn)程間通信,網(wǎng)絡(luò)編程筆記,tcp/ip

3-3--pipe3.c

? ? ? ? 利用兩個(gè)管道實(shí)現(xiàn)父進(jìn)程與子進(jìn)程的雙向通信,其中收發(fā)數(shù)據(jù)在不同的管道上進(jìn)行;

// gcc pipe3.c -o pipe3
// ./pipe3

#include <stdio.h>
#include <unistd.h>
#define BUF_SIZE 30

int main(int argc, char *argv[]){
    int fds1[2], fds2[2];
    char str1[] = "Who are you?";
    char str2[] = "Thank you for your message";
    char buf[BUF_SIZE];
    __pid_t pid;

    pipe(fds1), pipe(fds2); // 創(chuàng)建管道
    pid = fork();
    if(pid == 0){ // 子進(jìn)程執(zhí)行區(qū)域
        write(fds1[1], str1, sizeof(str1)); // 通過(guò)管道1寫(xiě)數(shù)據(jù)
        read(fds2[0], buf, BUF_SIZE); // 通過(guò)管道2讀數(shù)據(jù)
        printf("Child proc output: %s \n", buf);
    }
    else{ // 父進(jìn)程執(zhí)行區(qū)域
        read(fds1[0], buf, BUF_SIZE); // 通過(guò)管道1讀數(shù)據(jù)
        printf("Parent proc output: %s \n", buf);
        write(fds2[1], str2, sizeof(str2)); // 通過(guò)管道2寫(xiě)數(shù)據(jù)
        sleep(3);
    }
    return 0;
}

《TCP/IP網(wǎng)絡(luò)編程》閱讀筆記--進(jìn)程間通信,網(wǎng)絡(luò)編程筆記,tcp/ip

3-4--保存信息的回聲服務(wù)器端

? ? ? ? 服務(wù)器端創(chuàng)建兩個(gè)進(jìn)程,一個(gè)進(jìn)程負(fù)責(zé)與客戶端進(jìn)行通信,將客戶端發(fā)來(lái)的數(shù)據(jù)通過(guò)管道入口寫(xiě)到管道中;另一個(gè)進(jìn)程負(fù)責(zé)從管道出口中讀取數(shù)據(jù),并把讀取的數(shù)據(jù)保存在文件中;

? ? ? ? 具體可運(yùn)行代碼參考:Chapter11

// gcc echo_storeserv.c -o echo_storeserv
// ./echo_storeserv 9190

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <signal.h>
#include <sys/wait.h>
#include <arpa/inet.h>
#include <sys/socket.h>

#define BUF_SIZE 30

void error_handling(char *message){
    fputs(message, stderr);
    fputc('\n', stderr);
    exit(1);
}

void read_childproc(int sig){
    __pid_t pid;
    int status;
    pid = waitpid(-1, &status, WNOHANG);
    printf("remove proc id: %d \n", pid);
}

int main(int argc, char* argv[]){
    int serv_sock, clnt_sock;
    struct sockaddr_in serv_adr, clnt_adr;
    int fds[2];

    __pid_t pid;
    struct sigaction act; // 信號(hào)
    socklen_t adr_sz;
    int str_len, state;
    char buf[BUF_SIZE];
    if(argc != 2){
        printf("Usage : %s <port>\n", argv[0]);
        exit(1);
    }

    act.sa_handler = read_childproc; //設(shè)置信號(hào)處理函數(shù)
    sigemptyset(&act.sa_mask);
    act.sa_flags = 0;
    state = sigaction(SIGCHLD, &act, 0);

    serv_sock = socket(PF_INET, SOCK_STREAM, 0); // 創(chuàng)建 tcp socket
    memset(&serv_adr, 0, sizeof(serv_adr));
    serv_adr.sin_family = AF_INET;
    serv_adr.sin_addr.s_addr = htonl(INADDR_ANY);
    serv_adr.sin_port = htons(atoi(argv[1]));

    if(bind(serv_sock, (struct sockaddr*) &serv_adr, sizeof(serv_adr)) == -1){
        error_handling("bind() error"); 
    } 
    if(listen(serv_sock, 5) == -1){
        error_handling("listen() error");
    }

    pipe(fds);
    pid = fork();
    if(pid == 0){ // 子進(jìn)程執(zhí)行區(qū)域
        FILE* fp = fopen("echomsg.txt", "wt");
        char msgbuf[BUF_SIZE];
        int i, len;

        for(i = 0; i < 10; i++){
            len = read(fds[0], msgbuf, BUF_SIZE);
            fwrite((void*)msgbuf, 1, len, fp);
        }
        fclose(fp);
        return 0;
    }
    while(1){
        adr_sz = sizeof(clnt_adr);
        clnt_sock = accept(serv_sock, (struct sockaddr*)&clnt_adr, &adr_sz);
        if(clnt_sock == -1){
            continue;
        }
        else{
            puts("new client connected...");
        }

        pid = fork();
        if(pid == 0){
            close(serv_sock);
            while((str_len = read(clnt_sock, buf, BUF_SIZE)) != 0){
                write(clnt_sock, buf, str_len);
                write(fds[1], buf, str_len);
            }
            close(clnt_sock);
            puts("client disconnected...");
            return 0;
        }
        else{
            close(clnt_sock);
        }
    }
    close(serv_sock);
    return 0;

}

《TCP/IP網(wǎng)絡(luò)編程》閱讀筆記--進(jìn)程間通信,網(wǎng)絡(luò)編程筆記,tcp/ip文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-703816.html

到了這里,關(guān)于《TCP/IP網(wǎng)絡(luò)編程》閱讀筆記--進(jìn)程間通信的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 《TCP/IP網(wǎng)絡(luò)編程》閱讀筆記--getsockopt和setsockopt的使用

    《TCP/IP網(wǎng)絡(luò)編程》閱讀筆記--getsockopt和setsockopt的使用

    目錄 1--Socket的多種可選項(xiàng) 2--getsocketopt() 3--setsockopt() 4--代碼實(shí)例 ? ? ? ? Socket 擁有多種可選項(xiàng),其可分為 SOL_SOCKET 層,IPPROTO_IP 層和IPPROTO_TCP 層等,一般通過(guò) getsocketopt() 和 setsockopt() 函數(shù)進(jìn)行獲取和設(shè)置; ① 基于? getsockopt() 函數(shù),利用設(shè)置協(xié)議層為 SOL_SOCKET 和 SO_TYPE 可選項(xiàng)

    2024年02月09日
    瀏覽(47)
  • 《TCP/IP網(wǎng)絡(luò)編程》閱讀筆記--Timewait狀態(tài)和Nagle算法

    《TCP/IP網(wǎng)絡(luò)編程》閱讀筆記--Timewait狀態(tài)和Nagle算法

    ? ? ? ? 對(duì)于服務(wù)器端/客戶端,當(dāng)一端結(jié)束連接時(shí),會(huì)向另一端發(fā)送 FIN 消息;兩端的在經(jīng)過(guò)四次揮手過(guò)程后,其 Socket 不會(huì)馬上消除,而是會(huì)處于一個(gè) Time-wait 狀態(tài)的階段,此時(shí) Socket 擁有的 端口號(hào)并沒(méi)有得到釋放 ,因此 不能使用相同的端口號(hào) ; ? ? ? ? 只有先斷開(kāi)連接

    2024年02月09日
    瀏覽(35)
  • 《TCP/IP網(wǎng)絡(luò)編程》閱讀筆記--基于TCP的服務(wù)器端/客戶端

    《TCP/IP網(wǎng)絡(luò)編程》閱讀筆記--基于TCP的服務(wù)器端/客戶端

    目錄 1--TCP/IP協(xié)議棧 2--TCP服務(wù)器端默認(rèn)函數(shù)調(diào)用順序 3--TCP客戶端的默認(rèn)函數(shù)調(diào)用順序 4--Linux實(shí)現(xiàn)迭代回聲服務(wù)器端/客戶端 5--Windows實(shí)現(xiàn)迭代回聲服務(wù)器端/客戶端 6--TCP原理 7--Windows實(shí)現(xiàn)計(jì)算器服務(wù)器端/客戶端 ????????TCP/IP協(xié)議棧共分 4 層,可以理解為數(shù)據(jù)收發(fā)分成了 4 個(gè)層

    2024年02月10日
    瀏覽(30)
  • 《TCP/IP網(wǎng)絡(luò)編程》閱讀筆記--基于UDP的服務(wù)器端/客戶端

    《TCP/IP網(wǎng)絡(luò)編程》閱讀筆記--基于UDP的服務(wù)器端/客戶端

    目錄 1--TCP和UDP的主要區(qū)別 2--基于 UDP 的數(shù)據(jù) I/O 函數(shù) 3--基于 UDP 的回聲服務(wù)器端/客戶端 4--UDP客戶端Socket的地址分配 5--UDP存在數(shù)據(jù)邊界 6--UDP已連接與未連接的設(shè)置 ① TCP 提供的是可靠數(shù)據(jù)傳輸服務(wù),而 UDP 提供的是不可靠數(shù)據(jù)傳輸服務(wù); ② UDP 在結(jié)構(gòu)上比 TCP 更簡(jiǎn)潔,其不會(huì)

    2024年02月09日
    瀏覽(53)
  • 《TCP/IP網(wǎng)絡(luò)編程》閱讀筆記--基于Windows實(shí)現(xiàn)Hello Word服務(wù)器端和客戶端

    《TCP/IP網(wǎng)絡(luò)編程》閱讀筆記--基于Windows實(shí)現(xiàn)Hello Word服務(wù)器端和客戶端

    目錄 1--Hello Word服務(wù)器端 2--客戶端 3--編譯運(yùn)行 3-1--編譯服務(wù)器端 3-2--編譯客戶端 3-3--運(yùn)行 運(yùn)行結(jié)果:

    2024年02月10日
    瀏覽(63)
  • 【網(wǎng)絡(luò)編程】網(wǎng)絡(luò)通信基礎(chǔ)——簡(jiǎn)述TCP/IP協(xié)議

    【網(wǎng)絡(luò)編程】網(wǎng)絡(luò)通信基礎(chǔ)——簡(jiǎn)述TCP/IP協(xié)議

    個(gè)人主頁(yè):兜里有顆棉花糖 歡迎 點(diǎn)贊?? 收藏? 留言? 加關(guān)注??本文由 兜里有顆棉花糖 原創(chuàng) 收錄于專(zhuān)欄【網(wǎng)絡(luò)編程】【Java系列】 本專(zhuān)欄旨在分享學(xué)習(xí)網(wǎng)絡(luò)編程的一點(diǎn)學(xué)習(xí)心得,歡迎大家在評(píng)論區(qū)交流討論?? ip地址簡(jiǎn)單來(lái)說(shuō)就是用來(lái)描述網(wǎng)絡(luò)上一個(gè)設(shè)備的所在位置。 端

    2024年02月04日
    瀏覽(36)
  • 網(wǎng)絡(luò)編程——深入理解TCP/IP協(xié)議——OSI模型和TCP/IP模型:構(gòu)建網(wǎng)絡(luò)通信的基石

    網(wǎng)絡(luò)編程——深入理解TCP/IP協(xié)議——OSI模型和TCP/IP模型:構(gòu)建網(wǎng)絡(luò)通信的基石

    TCP/IP協(xié)議,即 傳輸控制協(xié)議/互聯(lián)網(wǎng)協(xié)議 ,是一組用于在計(jì)算機(jī)網(wǎng)絡(luò)中實(shí)現(xiàn)通信的協(xié)議。它由兩個(gè)主要的協(xié)議組成:TCP(傳輸控制協(xié)議)和IP(互聯(lián)網(wǎng)協(xié)議)。TCP負(fù)責(zé)確保數(shù)據(jù)的可靠傳輸,而IP則負(fù)責(zé)路由數(shù)據(jù)包以在網(wǎng)絡(luò)中傳遞。TCP/IP協(xié)議簇還包含其他輔助協(xié)議,如UDP(用戶數(shù)

    2024年02月14日
    瀏覽(33)
  • 網(wǎng)絡(luò)編程day2——基于TCP/IP協(xié)議的網(wǎng)絡(luò)通信

    ? ? ? ? 計(jì)算機(jī)S ? ? ? ? ? ? ? ? ? ? ? ? ????????????????????????計(jì)算機(jī)C ? ? ?創(chuàng)建socket對(duì)象 ? ? ? ? ? ? ? ? ????????????????? 創(chuàng)建socket對(duì)象 ? ? ?準(zhǔn)備通信地址(自己的ip(非公網(wǎng)ip))? ? ? 準(zhǔn)備通信地址 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? (計(jì)算

    2024年02月10日
    瀏覽(40)
  • linux【網(wǎng)絡(luò)編程】TCP協(xié)議通信模擬實(shí)現(xiàn)、日志函數(shù)模擬、守護(hù)進(jìn)程化、TCP協(xié)議通信流程、三次握手與四次揮手

    linux【網(wǎng)絡(luò)編程】TCP協(xié)議通信模擬實(shí)現(xiàn)、日志函數(shù)模擬、守護(hù)進(jìn)程化、TCP協(xié)議通信流程、三次握手與四次揮手

    Tcp通信模擬實(shí)現(xiàn)與Udp通信模擬實(shí)現(xiàn)的區(qū)別不大,一個(gè)是面向字節(jié)流,一個(gè)是面向數(shù)據(jù)報(bào);udp協(xié)議下拿到的數(shù)據(jù)可以直接發(fā)送,tcp協(xié)議下需要?jiǎng)?chuàng)建鏈接,用文件描述符完成數(shù)據(jù)的讀寫(xiě) 1.1.1 接口認(rèn)識(shí) 1.1.1.1 listen:監(jiān)聽(tīng)socket 1.1.1.2 accept:獲取連接 通信就用accept返回的文件描述符,

    2024年02月06日
    瀏覽(29)
  • Java網(wǎng)絡(luò)編程之IP,端口號(hào),通信協(xié)議(UDP,TCP)

    Java網(wǎng)絡(luò)編程之IP,端口號(hào),通信協(xié)議(UDP,TCP)

    ① C/S :客戶端/服務(wù)器 在用戶本地需要下載安裝客戶端程序,在遠(yuǎn)程有一個(gè)服務(wù)器端程序。 優(yōu)點(diǎn):畫(huà)面精美,用戶體驗(yàn)好 缺點(diǎn):用戶需要下載更新 ② B/S :瀏覽器/服務(wù)器 只需要一個(gè)瀏覽器,用戶通過(guò)指定網(wǎng)址訪問(wèn)對(duì)應(yīng)的服務(wù)器。 優(yōu)點(diǎn):不需要開(kāi)發(fā)客戶端,只需要頁(yè)面+服務(wù)

    2024年02月03日
    瀏覽(96)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包