popo 發問時間: 電腦與網際網路程式設計 · 1 0 年前

linux兩個程式如何傳參數?

我只知道要用pipe

可以寫一個實際的範例小程式嗎?

連宣告全部都要

c語言

比如:

程式a:

int main(){

讀取使用者輸入;

輸出使用者的輸入;

}

程式b:

int main(){

讀取a輸出;

印出字;

}

網路上面找到的看起來像是2信"函式"在互傳

我原本已經有2個程式要加pipe傳資料,完全看不懂pipe要加在那....

我只知道要宣告一個int fs[2]; 但不知道是要宣告在那個程式

已更新項目:

謝謝你~但我一定要用管線

請問一下有範例嗎??

因為網路上找到的很多都跟FORK()一起用

如果要和FORK()一起用又要怎麼寫??

2 個已更新項目:

回"是我"

沒有...兩個是不同的程式

只是B程式需要A程式的輸出才可以運作

3 個已更新項目:

可以再問嗎~如果要去衝過2個程式

有順序嗎??

還是有什麼特別的指令

還有就是這樣的寫法是只可以讀一次?

如果我想要b程式在a程式有輸出就印,也是這樣寫??

4 個已更新項目:

SORRY..打錯字...是執行= =""

6 個解答

評分
  • 是我
    Lv 5
    1 0 年前
    最佳解答

    兩個 Processes 有 Parent-Child 的關係嗎 ?

    2010-08-10 16:42:06 補充:

    使用 fork 就有 parent-child 的關係,以下程式碼供參:a.c

    #include <stdio.h>

    #include <sys/types.h>

    #include <unistd.h>int main()

    {

    int nFileDes[2];

    pid_t nPId;

    char s[1024]; if (pipe(nFileDes) < 0) {

    perror("pipe");

    exit(1);

    } if ((nPId = fork()) < 0) {

    perror("fork");

    exit(1);

    }

    else if (!nPId) { /* child */

    close(nFileDes[0]); /* 關閉 pipe 的 read 之 descriptor */

    dup2(nFileDes[1], 1); /* 使 stdout 之 descriptor(1) 以 pipe 的 write descriptor 所取代 */

    close(nFileDes[1]); /* 用不到 pipe 的 write 之 descriptor, 關閉之 */

    execlp("./b", "./b", NULL); /* 此後 b 的 stdout 輸出, 相當於對 pipe 的 write descriptor 輸出 */

    }

    else { /* parent */

    close(nFileDes[1]); /* 關閉 pipe 的 write 之 descriptor */

    dup2(nFileDes[0], 0); /* 使 stdin 之 descriptor(0) 以 pipe 的 read descriptor 所取代 */

    close(nFileDes[0]); /* 用不到 pipe 的 read 之 descriptor, 關閉之 */

    fgets(s, sizeof(s), stdin); /* 讀取 stdin, 相當於自 pipe 的 read descriptor 輸入 */

    printf("[a read]>> %s", s);

    }

    return 0;

    }b.c

    #include <stdio.h>int main()

    {

    char s[1024]; fgets(s, sizeof(s), stdin);

    printf("[b wrote]$$ %s", s); return 0;

    }

    2010-08-12 08:00:47 補充:

    『如果要去衝過2個程式』

    衝去哪 ???

    『如果我想要b程式在a程式有輸出就印』

    a.c 中的 fgets-printf 兩行改為:

    while (fgets(s, sizeof(s), stdin))

    printf("[a read]>> %s", s);

    b.c 中的 fgets-printf 兩行改為:

    setbuf(stdout, NULL);

    while (fgets(s, sizeof(s), stdin))

    printf("[b wrote]$$ %s", s);

    執行後,正常結束為按下 Ctrl-D (表 EOF)。

    2010-08-13 07:25:43 補充:

    『我還在努力試』

    編譯完 a, b 後, 執行 a 即可自動執行 b, 隨意鍵入一些文字按下 Enter 就可看到結果, 應不需多『努力』。

  • 匿名使用者
    6 年前

    您期待已久的 8891休閒城 熱烈開幕囉!

    8891遊戲網以優質的服務領先業界

    多位美女客服24小時即時線上為您服務!

    8891投注網有優於市面所有台灣運彩遊戲的 賠 ~ 率

    以及免下載真人 百家樂、21點、骰寶、各國賓果、餐廳賓果、彩球遊戲

    另有數百位真人視訊聊天辣妹與您進行互動聊天還有"精彩"電影喔!

    心動了嗎!! 快來體驗市面上最完質最高品質的服務

    現在有開放免費試玩喔! 官方 : 8891.NET

  • 匿名使用者
    7 年前

    【亞洲36588合法彩券公司直營 官網: A36588.NET 】

    【 最新活動→迎接新會員,首存狂送20% 】

    【運動→電子→對戰→現場→彩球 】

    【免費服務 →電影區、討論區、KTV歡唱、運動轉播、即時比分、24H客服 】

    【亞洲36588合法彩券公司直營 官網: A36588.NET 】

  • 1 0 年前

    1. pipe

    2. share memory

    3. message queue

    4. AF_UNIX socket

    例:

    1.使用pipe產生reader和writer兩個檔案描述子放在int fs[2]; 中

    2.fork()出一個子行程, 讓子行程使用execl()呼叫另一程式,並利用argv傳遞reader或writer檔案描述子

    3.從此兩方就可以使用此二描述子溝通

    先自行做做看,如果要程式碼的話,我再給您

    2010-08-11 23:31:50 補充:

    讚讚讚

    這是正確的解法

  • 您覺得這個回答如何?您可以登入為回答投票。
  • 1 0 年前

    除了 pipe 之外 Share memory 跟 Socket 也是都可以的

    Socket方式 也是很多人在用

  • 1 0 年前

    pipe?那似乎是管線命令的說。

    兩個function要互相傳送資料,簡單點可以試著以建立檔案的方式來做。

    A程式將資料輸出到C檔案中,在由B程式在C檔案中讀取。

    那如果你要用宣告變數的方式(int fs[2];)。

    可以將它放在 .h 檔案裡面,再由兩個AB程式include這個 .h 檔案。

    參考資料:
還有問題?馬上發問,尋求解答。