Linux C開發程式的問題?使用date!

2009-04-07 5:19 am
我在Linux下使用vi編寫一個C的程式,希望能經由Linux的編寫程式可以發送出一個現在時間的字串,並要能夠經由遠端平台再發送一個時間字串送至Linux C裡能夠更改到目前系統的時間,也就是說能夠經由送到Linux的字串能更改到Linux系統的整個時間日期:


而我的時間日期格式是: 小時:分鐘:秒 月/日/西元

所以我用date這個功能去做,而程式目前遇到問題大約如下:

include<stdio.h>
include<stdlib.h>
unsigned char str[30]; //全域變數
unsigned char str2[30]; //全域變數
int main()
{
str2[30]=system("date +%H:%M:%S%x") //不知道這樣對不對,希望能送出這種格式,如15:32:50 04/010/2009
strcpy(str,str2);
...............................................
簡略.....
ps:希望把str[30]送出去,是正確的字元或字串格式,但是目前我這樣做,送出去都是亂碼....不一定要用2個全域變數完成,只要能實現就可以了


//剛剛上面是傳送端

//以下是接收端,但是傳送端一直失敗,所以接收端還沒做

接收遠端送過來Linux C的字串並且一定要能夠更改系統的時間還沒做,因為傳送就有問題了,希望有高手能幫忙指導....

}

因為這個問題卡了很久,本來是用Time.h的gtime下去做
但是後來確定,這樣做的話只能傳送正確的時間,卻不能在遠端傳送正確的格式去更改系統時間,因此放棄了.....

這個問題看起來很簡單,可是我做的很灰心,希望有能力的高手能幫幫忙指導我...小弟先在此大大感謝

並附上20點,請求有緣人指導幫忙,麻煩了,謝謝!!
更新1:

To bean_bottom_2: 是的,這是送給另一台機器,不過最重要是在發送訊息前,主機的資料就還沒切割好,以致於送出去的字串是不對的,謝謝!!

回答 (2)

2009-04-07 5:14 pm
✔ 最佳答案
其實時間校正基本上是很複雜的, 對系統人員、使用者來說最簡單的方式是 NTP (Network Time Protocol); 若是自行取得甲機器的時間, 再去設定乙機器的時間, 會存在一些時間差。若您不在意這時間差, 那就等於沒差。
您欲使用函式 system() + 系統工具 date 取得時間, 其實是不太有效率的做法, 因使用 system() 執行外部的程式 date 對電腦來說是極度耗時的工作, 自呼叫 system() 起, 至真正取得時間乃至從 system() 返回, 所取得的時間與當時真正的時間就有一段差距了。
若沒錯的話, 您在另一主機設定時間應也是使用函式 system() + 系統工具 date; 若真是如此, 自甲機器取得時間 ─ 與真正時間已有些差距, 再設定乙機器的時間 ─ system() 函式再造成時間延遲 ......
故在下不建議此種做法, 但先回答您『目前我這樣做,送出去都是亂碼』疑問:
system() 返回值是 int 型態, 表示執行 date 的狀況, 無法將輸出結果導入 str2; 因此您所抓取 str2 的內容是不確定的。真要用外部工具 date, 並將取得其結果字串, 應使用 popen + fread (或 fgets 等) 函式。
不用 NTP 的情況下自行取得、設定時間, 在下的建議是:
取時間 time(), 設時間 stime()

取時間 gettimeofday(), 設時間 settimeofday()
以甲機 time() + 乙機 stime() 以 TCP 方式傳送為例 (略過建立 Connection, 不檢查錯誤):
甲機:
time_t nTime;
nTime = htonl(time(NULL));
write(sock, &nTime, sizeof(nTime));
乙機:
time_t nTime;
read(sock, &nTime, sizeof(nTime));
nTime = ntohl(nTime);
stime(&nTime);
不需任何時間格式。只是設定時間需要權限, 在乙機的程式執行者須為 root, 但不是也無妨; 將該執行檔 (例如檔名為 adjtime) 的 owner 設為 root, 再執行 chmod +s adjtime 即可 (但仍需 root 協助設 owner、chmod); 之後一般 user 執行 adjtime 就可校正時間。
2009-04-07 6:58 am
I am confused about the question. Is it the question "to send a string to another machine correctly"? Thanks for clarifying.


收錄日期: 2021-04-30 13:01:44
原文連結 [永久失效]:
https://hk.answers.yahoo.com/question/index?qid=20090406000010KK09681

檢視 Wayback Machine 備份