作者 主題: 請問tmpfile()  (閱讀 7970 次)

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

essle9

  • 懷疑的國中生
  • **
  • 文章數: 80
    • 檢視個人資料
請問tmpfile()
« 於: 2007-08-09 15:13 »
它的定義是建立一個臨時的檔案和唯一的名稱,然後傳回一個檔案指標,就像是以fopen( )所傳回的指標。當使用fclose( )或是程式結束時,此檔案會自動地移除。
ex :
 
代碼: [選擇]
FILE * pFile;
           pFile = tmpfile ();

           //read,write......

           fclose (pFile)


這個我可以理解,可是現在如果我是用外部程式像
system("netstat -tan");
我怎麼跟tmpfile()撘配,怎麼把"netstat -tan" 導到tmpfile
總不會是"netstat -tan > *pFile"或"netstat -tan > tmpfile()"吧?

用意是不想用"netstat -tan > tmpfile.txt" 然後開檔讀檔,再rm -f tmpfile.txt
我有成功試過popen(),但對我整體程式會有點小影響,我想再試試tmpfile();

twu2

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 5396
  • 性別: 男
    • 檢視個人資料
    • http://blog.teatime.com.tw/1
請問tmpfile()
« 回覆 #1 於: 2007-08-09 15:23 »
pFile 是個指標, 對別的程式沒有意義.

自己隨機產生一個檔名... 如 pid + timestamp + xxx 之類的組合, 保證是那時間唯一... 然後把程式結果導到該檔名, 然後再去打開那個檔案吧.

另外, 都在寫程式了, 不要老是把一些 system call, function, api 就能做的事情, 用 system 去執行, 既不方便檢查結果, 又不怎麼安全. 直接用系統本身提供的 function 來處理不是比較好嗎?

yasachi

  • 可愛的小學生
  • *
  • 文章數: 4
    • 檢視個人資料
Re: 請問tmpfile()
« 回覆 #2 於: 2007-08-09 17:30 »
引述: "essle9"
它的定義是建立一個臨時的檔案和唯一的名稱,然後傳回一個檔案指標,就像是以fopen( )所傳回的指標。當使用fclose( )或是程式結束時,此檔案會自動地移除。
ex :
 
代碼: [選擇]
FILE * pFile;
           pFile = tmpfile ();

           //read,write......

           fclose (pFile)


這個我可以理解,可是現在如果我是用外部程式像
system("netstat -tan");
我怎麼跟tmpfile()撘配,怎麼把"netstat -tan" 導到tmpfile
總不會是"netstat -tan > *pFile"或"netstat -tan > tmpfile()"吧?

用意是不想用"netstat -tan > tmpfile.txt" 然後開檔讀檔,再rm -f tmpfile.txt
我有成功試過popen(),但對我整體程式會有點小影響,我想再試試tmpfile();


雖然我也覺得上面的大哥說的沒錯, 不過有時system 還蠻好用的:)

您可以先把指令利用sprintf傳到一個變數去
例如:
sprintf(shell_cmd, "netstat -tan >%s", qfile);
system(shell_cmd);

試看看吧~不保證成功
 :D

essle9

  • 懷疑的國中生
  • **
  • 文章數: 80
    • 檢視個人資料
請問tmpfile()
« 回覆 #3 於: 2007-08-13 15:50 »
to twu2:
引用
另外, 都在寫程式了, 不要老是把一些 system call, function, api 就能做的事情, 用 system 去執行, 既不方便檢查結果, 又不怎麼安全. 直接用系統本身提供的 function 來處理不是比較好嗎?


可以麻煩舉實例或再說清楚一點嗎?

to yasachi:
我試過了,編譯不會錯,執行好像會錯,我是直接放在我程式,有空我再特地寫個單純一點的來試試

elleryq

  • 區域板主
  • 鑽研的研究生
  • *****
  • 文章數: 908
  • 性別: 男
    • 檢視個人資料
    • Thinking more...
請問tmpfile()
« 回覆 #4 於: 2007-08-13 21:02 »
twu2 的意思是說
要嗎~你就乾脆寫 bash,直接呼叫現成寫好的程式
不要費工夫去寫 C 了。
Plan your work, then work your plan.
我的首頁:http://blog.elleryq.idv.tw
351899by http://counter.li.org

yasachi

  • 可愛的小學生
  • *
  • 文章數: 4
    • 檢視個人資料
請問tmpfile()
« 回覆 #5 於: 2007-08-14 14:01 »
引述: "essle9"
to twu2:
引用
另外, 都在寫程式了, 不要老是把一些 system call, function, api 就能做的事情, 用 system 去執行, 既不方便檢查結果, 又不怎麼安全. 直接用系統本身提供的 function 來處理不是比較好嗎?


可以麻煩舉實例或再說清楚一點嗎?

to yasachi:
我試過了,編譯不會錯,執行好像會錯,我是直接放在我程式,有空我再特地寫個單純一點的來試試

是啊~~真的執行會錯耶, 因為他是個指標不是個檔名 :P 平常用習慣了,沒想到遇到鐵板就不行了, 不過啊, 我有試了另一個方法, 您可以試看看可不可以 :D
#include <stdio.h>

int main()
{
    char tmpname[L_tmpnam];
    char *filename;
    FILE *tmpfp;

    int fd;
    char *cont;

    filename = tmpnam(tmpname);
    printf("Temporary file name is :%s\n", filename);
    tmpfp = tmpfile();

    char *const ps_argv[]= {"netstat", "-tan >", filename};
    if(execl("touch", filename))
       perror("execl");
    if(execl("/bin/netstat", "-tan >", filename))
       perror("execl");

    read(tmpfp, cont, 1024);
    printf("cont = %s\n", cont);
   
    exit(0);
}

twu2

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 5396
  • 性別: 男
    • 檢視個人資料
    • http://blog.teatime.com.tw/1
請問tmpfile()
« 回覆 #6 於: 2007-08-14 14:20 »
樓上的同學... 建議回去再看看書吧.
你認為 tmpfile() 是用前一次跑 tmpname() 產生的檔名嗎? 如果是這樣, tmpfile() 還能保證是產生唯一的暫存檔嗎?
為什麼你認為把資料寫到 tmpname() 的檔案, 會跑到 tmpfile() 打開的檔案?

指標 => address => 跨行程的 address 是完全沒有意義的. 硬要把某個行程的指標拿給另一個用, 唯一的可能就是造成 segment fault 的 signal 產生.

thyme

  • 老人組
  • 俺是博士!
  • *****
  • 文章數: 1281
    • 檢視個人資料
請問tmpfile()
« 回覆 #7 於: 2007-08-14 14:30 »
這位同學,我認為 popen() 應該可以配合你那 tmpfile() 使用。
用 popen() 執行 netstat -tan,再用 fread/fwrite 或 fscanf/fprintf 來做讀出及寫入的動作。

yasachi

  • 可愛的小學生
  • *
  • 文章數: 4
    • 檢視個人資料
請問tmpfile()
« 回覆 #8 於: 2007-08-14 14:36 »
引述: "twu2"
樓上的同學... 建議回去再看看書吧.
你認為 tmpfile() 是用前一次跑 tmpname() 產生的檔名嗎? 如果是這樣, tmpfile() 還能保證是產生唯一的暫存檔嗎?
為什麼你認為把資料寫到 tmpname() 的檔案, 會跑到 tmpfile() 打開的檔案?

指標 => address => 跨行程的 address 是完全沒有意義的. 硬要把某個行程的指標拿給另一個用, 唯一的可能就是造成 segment fault 的 signal 產生.


哇~感謝指正
其實偶剛在改的時候也一直覺得有問題,所以改寫成下面的形式~不小得有沒有問題:(
#include <stdio.h>

int main()
{
    char tmpname[]="temp-XXXXXXXX";
    int fd;
    char *cont;

    fd = mkstemp(tmpname);
    printf("Temporary file name is :%s\n", tmpname);

    char *const ps_argv[]= {"netstat", "-tan >", tmpname};
    if(execl("/bin/netstat", "-tan >", tmpname))
       perror("execl");

    read(fd, cont, 1024);
    printf("cont = %s\n", cont);
   
    exit(0);
}

twu2

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 5396
  • 性別: 男
    • 檢視個人資料
    • http://blog.teatime.com.tw/1
請問tmpfile()
« 回覆 #9 於: 2007-08-14 17:02 »
引述: "yasachi"
其實偶剛在改的時候也一直覺得有問題,所以改寫成下面的形式~不小得有沒有問題:(


自己試看看不就知道會不會有問題了?
你認為打開一個檔案後, 另一個程式也一定能打開那個檔案做寫入的動作嗎? 這樣子處理與直接把結果存到檔案中再打開有什麼差別? 為什麼一定要在執行前就先要把結果的檔案打開?

HaWay

  • 大隻佬!
  • 老人組
  • 俺是博士!
  • *****
  • 文章數: 3980
    • 檢視個人資料
請問tmpfile()
« 回覆 #10 於: 2007-08-14 22:03 »
你應該是要 netstat -tan 的執行結果吧。
會比較建議用 function api 的方式去取得,不過我剛找了一下,也頗難的。
通常這樣我會建議你用 open file 的方式去讀取 /proc/sys/net/* 裡面的資料。
但你沒說你要什麼東西,所以無法幫你。
透過 system 的方法真的不對。
我做人那麼 nice, 肯定有什麼誤會.....

essle9

  • 懷疑的國中生
  • **
  • 文章數: 80
    • 檢視個人資料
請問tmpfile()
« 回覆 #11 於: 2007-08-15 01:21 »
沒想到一下就那麼多高手來指正
雖說用system不太好,可是.....我是寫cgi,而且是embaded linux....??
有時想取得ip,又有時想拿到透過shell過濾後的東西(如:cut,awk.....等)
不是每個東西都可以在/proc/sys或某個地方取得
就算可以,最後不也是要透過開讀檔來取得?
那像這種情況,哪一種方法比較適合呢?
會想到tmpfile()這function是因為有時難免會用到開檔讀檔再parsing來拿到我想要的東西,可是每次都建檔然後再刪掉,覺得這手法有點遜,也可能我誤解tmpfile()的真正用法了吧?