<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                # 管道,第 1 部分:管道介紹 > 原文:<https://github.com/angrave/SystemProgramming/wiki/Pipes%2C-Part-1%3A-Introduction-to-pipes> ## 什么是 IPC? 進程間通信是一個進程與另一個進程通信的任何方式。你已經看過這種虛擬內存的一種形式了!一段虛擬內存可以在父母和孩子之間共享,從而實現通信。您可能希望將該內存包裝在`pthread_mutexattr_setpshared(&attrmutex, PTHREAD_PROCESS_SHARED);`互斥鎖(或進程寬互斥鎖)中以防止競爭條件。 有更多標準的 IPC 方式,比如管道!考慮您是否在終端中鍵入以下內容 ```source-shell $ ls -1 | cut -d'.' -f1 | uniq | sort | tee dir_contents ``` 以下代碼的作用是什么(如果你愿意,你可以跳過這個并不重要)?那么它`ls`是當前目錄(-1 表示它每行輸出一個條目)。然后`cut`命令在第一個周期之前獲取所有內容。 Uniq 確保所有行都是 uniq,排序將它們和 tee 輸出排序到文件。 重要的是,bash 創建 **5 個獨立的進程**,并將它們的標準出口/標準連接到管道,其中的跟蹤看起來像這樣。 (0)ls(1)------&gt;(0)cut(1)-------&gt;(0)uniq(1)------&gt;(0)排序(1)------&gt;(0)tee(1) 管道中的數字是每個進程的文件描述符,箭頭表示重定向或管道輸出的位置。 ## 什么是管道? POSIX 管道幾乎就像它的真正對應物 - 你可以在一端填充字節,它們將以相同的順序出現在另一端。然而,與真實管道不同,進程始終在同一方向,一個文件描述符用于讀取,另一個文件描述符用于寫入。 `pipe`系統調用用于創建管道。 ```c int filedes[2]; pipe (filedes); printf("read from %d, write to %d\n", filedes[0], filedes[1]); ``` 這些文件描述符可以與`read`一起使用 - ```c // To read... char buffer[80]; int bytesread = read(filedes[0], buffer, sizeof(buffer)); ``` 和`write` - ```c write(filedes[1], "Go!", 4); ``` ## 如何使用管道與子進程通信? 使用管道的常用方法是在分叉之前創建管道。 ```c int filedes[2]; pipe (filedes); pid_t child = fork(); if (child > 0) { /* I must be the parent */ char buffer[80]; int bytesread = read(filedes[0], buffer, sizeof(buffer)); // do something with the bytes read } ``` 然后,孩子可以將消息發送回父母: ```c if (child == 0) { write(filedes[1], "done", 4); } ``` ## 我可以在一個過程中使用管道嗎? 簡短回答:是的,但我不確定你為什么要大聲笑! 這是一個向自己發送消息的示例程序: ```c #include <unistd.h> #include <stdlib.h> #include <stdio.h> int main() { int fh[2]; pipe(fh); FILE *reader = fdopen(fh[0], "r"); FILE *writer = fdopen(fh[1], "w"); // Hurrah now I can use printf rather than using low-level read() write() printf("Writing...\n"); fprintf(writer,"%d %d %d\n", 10, 20, 30); fflush(writer); printf("Reading...\n"); int results[3]; int ok = fscanf(reader,"%d %d %d", results, results + 1, results + 2); printf("%d values parsed: %d %d %d\n", ok, results[0], results[1], results[2]); return 0; } ``` 以這種方式使用管道的問題是寫入管道可能阻塞,即管道僅具有有限的緩沖容量。如果管道已滿,寫入過程將阻止!緩沖區的最大大小取決于系統;典型值從 4KB 到 128KB。 ```c int main() { int fh[2]; pipe(fh); int b = 0; #define MESG "..............................." while(1) { printf("%d\n",b); write(fh[1], MESG, sizeof(MESG)) b+=sizeof(MESG); } return 0; } ``` 參見[管道,第 2 部分:管道編程秘密](/angrave/SystemProgramming/wiki/Pipes%2C-Part-2%3A-Pipe-programming-secrets)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看