Linux C編程如何使用線上說明來解決編程問題?

來源:互聯網
上載者:User

標籤:c

1.背景

    多次學習C語言一直無法踏入C語言的大門,每次都是在學習C語言中的那些系統調用庫函數等望而卻只,linux下的系統調用需要我們去記憶一些沒有規律的結構體和一些大寫的宏定義並且還有一個函數多種形式的例如print fprintf sprintf等等,看起來就很不爽,寫起東西來真的很無語。什麼都要自己寫,寫什麼都要對返回結果進行出錯處理的判斷。(C語言菜鳥的一些抱怨勿噴),最近又重新拾起C來學習linux下的C編程。目前主要看linux程式設計(早年買的書),unix/linux編程實踐(電子版) unix環境進階編程(電子版),準備入手unix/linux編程實踐主要看這本書其他兩本輔助來看。當我在看unix/linux編程實踐的時候我先翻了一下目錄很讓我感覺耳目一新,不像是那種中規中矩的書,全書輔以實際例子來講解,每一個例子都涉及了很多系統調用。通過例子不緊緊學習到了系統調用的使用還掌握了編程的技巧。最近才剛剛看到第二章,在第二章中該書講解了如何通過linux線上說明來解決編程問題,讓我著實對這本書產生了很高的興趣。不用一開始就去學習大量枯燥的系統調用和庫函數就可以寫出一些小程式。


2.怎麼去實現

    舉個例子來說如何去實現who命令的編寫的,對於我這樣一個菜鳥實在不知道該如何下手。

1.那麼第一步我該man who看看who命令本身是如何來實現的。

在man who的DESCRIPTION中找到了這樣的一句話。

If FILE is not specified, use /var/run/utmp.  /var/log/wtmp as FILE is common

大致意思就是who是通過讀取一個檔案來顯示資訊的,如果不指定這個檔案的話預設就是/var/run/utmp和/var/log/wtmp兩個檔案。

2.接著立刻搜尋utmp wtmp相關的man資訊

man -k utmp

man -k wtmp

搜尋的結果均指向了#include<utmp.h>

3.緊接著就看看這個標頭檔中包含了啥

           struct utmp {               short   ut_type;              /* Type of record */               pid_t   ut_pid;               /* PID of login process */               char    ut_line[UT_LINESIZE]; /* Device name of tty - "/dev/" */               char    ut_id[4];             /* Terminal name suffix,                                                or inittab(5) ID */               char    ut_user[UT_NAMESIZE]; /* Username */               char    ut_host[UT_HOSTSIZE]; /* Hostname for remote login, or                                                kernel version for run-level                                                messages */               struct  exit_status ut_exit;  /* Exit status of a process                                                marked as DEAD_PROCESS; not                                                used by Linux init(8) */               /* The ut_session and ut_tv fields must be the same size when                  compiled 32- and 64-bit.  This allows data files and shared                  memory to be shared between 32- and 64-bit applications. */           #if __WORDSIZE == 64 && defined __WORDSIZE_COMPAT32               int32_t ut_session;           /* Session ID (getsid(2)),                                                used for windowing */               struct {                   int32_t tv_sec;           /* Seconds */                   int32_t tv_usec;          /* Microseconds */               } ut_tv;                      /* Time entry was made */           #else                long   ut_session;           /* Session ID */                struct timeval ut_tv;        /* Time entry was made */           #endif               int32_t ut_addr_v6[4];        /* Internet address of remote                                                host; IPv4 address uses                                                just ut_addr_v6[0] */               char __unused[20];            /* Reserved for future use */           };

一個utmp結構體就出來了,大致猜出來可能是/var/log/utmp或者/var/log/wtmp中存放的資料都是這種結構體的資料。那麼思路就出來了,讀這個檔案每次對一個結構體大小的資料。然後輸出結果體中想要的成員變數就OK了。那麼剩下的就是程式編寫的問題了。

3.實踐總結

    剛看第二章總算還有點信心繼續學下去了,不至於像兩年前學習C語言那樣的迷茫,知道了如果去解決問題在linux下怎麼去尋求協助了。希望通過部落格的形式記錄自己學習C語言的一些感悟吧。

本文出自 “專註linux” 部落格,請務必保留此出處http://forlinux.blog.51cto.com/8001278/1435127

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.