2010-12-14 9 views
2

私はCocoaアプリケーションで最後にログインしてからの時間をチェックしようとしています。私はこのような何かをしなくても、それを行うしたいと思います:目的 "unix" finger "コマンドのCバージョン

例えば
NSTask *task; 
task = [[NSTask alloc] init]; 
[task setLaunchPath: @"/usr/bin/finger"]; 

NSArray *arguments; 
arguments = [NSArray arrayWithObject: NSUserName()]; 
[task setArguments: arguments]; 

NSPipe *pipe; 
pipe = [NSPipe pipe]; 
[task setStandardOutput: pipe]; 

NSFileHandle *file; 
file = [pipe fileHandleForReading]; 

[task launch]; 

NSData *data; 
data = [file readDataToEndOfFile]; 

NSString *stringData = [[NSString alloc] initWithData: data encoding: NSUTF8StringEncoding]; 
NSLog (@"%@", stringData); 

は、UnixのwhoamiコマンドはNSUserNameのObjective Cの相当しています。

+0

これは実際問題の解決策ではありません。b私は指が世界で最も単純なネットワークプロトコルについて知っていることに気づくでしょう。ポート79にTelnetで接続し、ログイン名を入力してReturnキーを押します。だから少なくとも、フォークを避けることができます。 (http://tools.ietf.org/html/rfc1288) – Ken

答えて

6

これは本当に興味深い質問でした。質問してくれてありがとう。私のコンピュータ上で

#import <utmpx.h> 

struct utmpx *user; 
setutxent(); 
while ((user = getutxent()) != NULL) { 
    if (user->ut_type == USER_PROCESS) { 
     time_t loggedIn = user->ut_tv.tv_sec; 
     NSDate * d = [NSDate dateWithTimeIntervalSince1970:loggedIn]; 
     NSLog(@"%s logged in at %@", user->ut_user, d); 
    } 
} 
endutxent(); 

、これは記録されます:

dave logged in at 2010-12-06 09:59:13 -0800 
dave logged in at 2010-12-13 19:14:20 -0800 

この:)

は、それは次のように思いついた答えとして、私は行ってfingerにとしてソースを見つけました端末のfinger daveの出力と一致します。

Login: dave      Name: Dave DeLong 
Directory: /Users/dave     Shell: /bin/bash 
On since Mon Dec 6 09:59 (PST) on console, idle 7 days 9:18 (messages off) 
On since Mon Dec 13 19:14 (PST) on ttys000 
On since Thu Dec 9 17:21 (PST) on ttys001 (messages off) 
+0

偉大な答え:) – d11wtq

+0

すごい!ありがとう:) – David

0

おそらく、その情報が格納されているシステムファイルからその情報を読み込む必要があります。 unix上の 'utmp'ファイルかもしれません。

結局のところ、それは '指'と同じです。