作者 主題: linux program-->C 程式碼內加入"執行檔",該如何撰寫?  (閱讀 8815 次)

0 會員 與 1 訪客 正在閱讀本文。

adik4141

  • 可愛的小學生
  • *
  • 文章數: 6
    • 檢視個人資料
請問各位先進,
我在linux 環境下,寫了一個rs232接收程式,
它會讀取某個裝置傳送過來的『值』.
這支rs232會根據收到的值,再去做一些事情,例如

.........
.........
 while(1)
  {
   res=read(fd,buf,255);
   buf[res]=0;
   new_buf=atoi(buf);
      
   switch (new_buf){
   case 1000:
      [user 1234]
      break;
    case 1001:
      [user 1235]
      break;
   case 1010:
      [user 1236]
      break;   
   }
   
   if(buf[0]=='/')
        break;
  }
..............
..............
根據 new_buf 判斷case去執行做什麼,我的問題是 如果要去做的事是『一個自己寫的執行檔+參數』,這執行檔(user)+參數,在終端機可以獨立運作,ex: user 1234 .
但如果要將該執行檔整合到rs232的switch case 該如何撰寫?
該使用pthread嗎?

kenduest

  • 酷!學園 學長們
  • 俺是博士!
  • *****
  • 文章數: 3675
    • 檢視個人資料
    • http://kenduest.sayya.org

看不大懂你的意思,你的問題是

1. 如何執行該檔案嗎?對於呼叫執行外部程式檔函數不清楚,還是?
2. 還是你要知道 c 程式如何接收命令列傳入的參數方式?
I am kenduest - 小州

my website: http://kenduest.sayya.org/

adik4141

  • 可愛的小學生
  • *
  • 文章數: 6
    • 檢視個人資料
您好,
感謝您的回覆...
1. 如何執行該檔案嗎?對於呼叫執行外部程式檔函數不清楚
2. 還是你要知道 c 程式如何接收命令列傳入的參數方式?

rs232.c :接收到某裝置的"值",之後判斷是"多少值",再根據"數值"去執行user.
而user是編譯user.c而來的執行檔,可以在終端機運作,例如 執行檔+參數 -->user 1234.
我要將上述的rs232.c 經gcc編譯為一個執行檔.

所以看起來應該是1吧?
如敘述哪邊不清楚,再麻煩告知小弟.

kenduest

  • 酷!學園 學長們
  • 俺是博士!
  • *****
  • 文章數: 3675
    • 檢視個人資料
    • http://kenduest.sayya.org
代碼: [選擇]
#include <stdio.h>
#include <unistd.h>

int main()
{
  char prog[]="/bin/date";
  char args[]="+%Y-%m-%d";

  execlp(prog,prog,args,NULL);

}

詳細呼叫方式, man 3 exec 有完整說明。

另外 exec() 呼叫後程式就結束了,若你還要可以繼續執行,請配合 fork 呼叫一起處理,也就是產生 fork 後用該 child process 去 exec() 執行外部程式。
I am kenduest - 小州

my website: http://kenduest.sayya.org/

adik4141

  • 可愛的小學生
  • *
  • 文章數: 6
    • 檢視個人資料
Gooood!!!! 就是這個........
謝謝您....

elleryq

  • 區域板主
  • 鑽研的研究生
  • *****
  • 文章數: 908
  • 性別: 男
    • 檢視個人資料
    • Thinking more...
除了exec系列函數
也可以用 system() 或 popen()/pclose()
Plan your work, then work your plan.
我的首頁:http://blog.elleryq.idv.tw
351899by http://counter.li.org

adik4141

  • 可愛的小學生
  • *
  • 文章數: 6
    • 檢視個人資料
.........
 while(1)
  {
   res=read(fd,buf,255);
   buf[res]=0;
   new_buf=atoi(buf);
   switch (new_buf){
   case 0100:
      printf("0100\n");      
      execlp ("user","user","123","0","0","0101",(char *) 0);
      break;
   case 0101:
      printf("0101\n");      
      execlp ("user","user","123","0","0","0101",(char *) 0);
      break;
   case 0110:
      printf("0110\n");      
      execlp ("user","user","123","0","0","0110",(char *) 0);
      break;
   case 0111:
      printf("0111\n");      
      execlp ("user","user","123","0","0","0111",(char *) 0);
      break;    
   case 1000:
      printf("1000\n");
      execlp ("user","user","123","0","0","1000",(char *) 0);
      break;
   }
    
   if(buf[0]=='/')
        break;
  }
..............

另外 exec() 呼叫後程式就結束了,若你還要可以繼續執行,請配合 fork 呼叫一起處理,也就是產生 fork 後用該 child process 去 exec() 執行外部程式
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

     --->>>仍要繼續執行,研究了fork()用法,還是看不太懂
     請問各位先進 該如何將上述的程式改寫?
« 上次編輯: 2010-08-10 13:56 由 adik4141 »

kenduest

  • 酷!學園 學長們
  • 俺是博士!
  • *****
  • 文章數: 3675
    • 檢視個人資料
    • http://kenduest.sayya.org

自己找一本 unix programming 的書翻一下,或者是自己用 google 查一下 fork 用法,並且 manpage 自己翻翻。

當然,更簡單一點你可以用前面其他朋友提供的方式,用 system() 與 popen() 這類函數。但是這是透過 shell 來呼叫執行的,控制性您得自己評估。
I am kenduest - 小州

my website: http://kenduest.sayya.org/

adik4141

  • 可愛的小學生
  • *
  • 文章數: 6
    • 檢視個人資料
恩嗯~~感恩....
成功了!
感謝 kenduest大的解說....  :D