當前位置:首頁 » 編程語言 » linux下C語言日歷
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

linux下C語言日歷

發布時間: 2022-04-11 10:55:41

A. 怎樣學習在linux操作系統下用c語言編程

這篇文章介紹在LINUX下進行C語言編程所需要的基礎知識.在這篇文章當中,我們將會學到以下內容:
源程序編譯
Makefile的編寫
程序庫的鏈接
程序的調試
頭文件和系統求助

--------------------------------------------------------------------------------
1.源程序的編譯
在Linux下面,如果要編譯一個C語言源程序,我們要使用GNU的gcc編譯器. 下面我們以一個實例來說明如何使用gcc編譯器.
假設我們有下面一個非常簡單的源程序(hello.c):
int main(int argc,char **argv)
{
printf("Hello Linux\n");
}

要編譯這個程序,我們只要在命令行下執行:
gcc -o hello hello.c
gcc 編譯器就會為我們生成一個hello的可執行文件.執行./hello就可以看到程序的輸出結果了.命令行中
gcc表示我們是用gcc來編譯我們的源程序,-o 選項表示我們要求編譯器給我們輸出的可執行文件名為hello
而hello.c是我們的源程序文件. gcc編譯器有許多選項,一般來說我們只要知道其中的幾個就夠了. -o選項我們已經知道了,表示我們要求輸出的可執行文件名.
-c選項表示我們只要求編譯器輸出目標代碼,而不必要輸出可執行文件. -g選項表示我們要求編譯器在編譯的時候提供我們以後對程序進行調試的信息. 知道了這三個選項,我們就可以編譯我們自己所寫的簡單的源程序了,如果你想要知道更多的選項,可以查看gcc的幫助文檔,那裡有著許多對其它選項的詳細說明.
2.Makefile的編寫
假設我們有下面這樣的一個程序,源代碼如下:

/* main.c */
#include "mytool1.h"
#include "mytool2.h"

int main(int argc,char **argv)
{
mytool1_print("hello");
mytool2_print("hello");
}

/* mytool1.h */
#ifndef _MYTOOL_1_H
#define _MYTOOL_1_H

void mytool1_print(char *print_str);

#endif

/* mytool1.c */
#include "mytool1.h"
void mytool1_print(char *print_str)
{
printf("This is mytool1 print %s\n",print_str);
}

/* mytool2.h */
#ifndef _MYTOOL_2_H
#define _MYTOOL_2_H

void mytool2_print(char *print_str);

#endif

/* mytool2.c */
#include "mytool2.h"
void mytool2_print(char *print_str)
{
printf("This is mytool2 print %s\n",print_str);
}

當然由於這個程序是很短的我們可以這樣來編譯
gcc -c main.c
gcc -c mytool1.c
gcc -c mytool2.c
gcc -o main main.o mytool1.o mytool2.o
這樣的話我們也可以產生main程序,而且也不時很麻煩.但是如果我們考慮一下如果有一天我們修改了其中的一個文件(比如說mytool1.c)
那麼我們難道還要重新輸入上面的命令?也許你會說,這個很容易解決啊,我寫一個SHELL腳本,讓她幫我去完成不就可以了.是的對於這個程序來說,是可以
起到作用的.但是當我們把事情想的更復雜一點,如果我們的程序有幾百個源程序的時候,難道也要編譯器重新一個一個的去編譯? 為此,聰明的程序員們想出了一個很好的工具來做這件事情,這就是make.我們只要執行以下make,就可以把上面的問題解決掉.在我們執行
make之前,我們要先編寫一個非常重要的文件.--Makefile.對於上面的那個程序來說,可能的一個Makefile的文件是: # 這是上面那個程序的Makefile文件
main:main.o mytool1.o mytool2.o
gcc -o main main.o mytool1.o mytool2.o
main.o:main.c mytool1.h mytool2.h
gcc -c main.c
mytool1.o:mytool1.c mytool1.h
gcc -c mytool1.c
mytool2.o:mytool2.c mytool2.h
gcc -c mytool2.c

有了這個Makefile文件,不過我們什麼時候修改了源程序當中的什麼文件,我們只要執行make命令,我們的編譯器都只會去編譯和我們修改的文件有關的文件,其它的文件她連理都不想去理的.
下面我們學習Makefile是如何編寫的.
在Makefile中也#開始的行都是注釋行.Makefile中最重要的是描述文件的依賴關系的說明.一般的格式是:
target: components
TAB rule

第一行表示的是依賴關系.第二行是規則.
比如說我們上面的那個Makefile文件的第二行
main:main.o mytool1.o mytool2.o
表示我們的目標(target)main的依賴對象(components)是main.o mytool1.o mytool2.o
當倚賴的對象在目標修改後修改的話,就要去執行規則一行所指定的命令.就象我們的上面那個Makefile第三行所說的一樣要執行 gcc -o
main main.o mytool1.o mytool2.o 注意規則一行中的TAB表示那裡是一個TAB鍵 Makefile有三個非常有用的變數.分別是$@,$^,$

int main(int argc,char **argv)
{
double value;
printf("Value:%f\n",value);
}

這個程序相當簡單,但是當我們用 gcc -o temp temp.c 編譯時會出現下面所示的錯誤.
/tmp/cc33Ky.o: In function `main':
/tmp/cc33Ky.o(.text+0xe): undefined reference to `log'
collect2: ld returned 1 exit status

出現這個錯誤是因為編譯器找不到log的具體實現.雖然我們包括了正確的頭文件,但是我們在編譯的時候還是要連接確定的庫.在Linux下,為了
使用數學函數,我們必須和數學庫連接,為此我們要加入 -lm 選項. gcc -o temp temp.c
-lm這樣才能夠正確的編譯.也許有人要問,前面我們用printf函數的時候怎麼沒有連接庫呢?是這樣的,對於一些常用的函數的實現,gcc編譯器會自
動去連接一些常用庫,這樣我們就沒有必要自己去指定了. 有時候我們在編譯程序的時候還要指定庫的路徑,這個時候我們要用到編譯器的
-L選項指定路徑.比如說我們有一個庫在 /home/hoyt/mylib下,這樣我們編譯的時候還要加上
-L/home/hoyt/mylib.對於一些標准庫來說,我們沒有必要指出路徑.只要它們在起預設庫的路徑下就可以了.系統的預設庫的路徑/lib
/usr/lib /usr/local/lib 在這三個路徑下面的庫,我們可以不指定路徑. 還有一個問題,有時候我們使用了某個函數,但是我們不知道庫的名字,這個時候怎麼辦呢?很抱歉,對於這個問題我也不知道答案,我只有一個傻辦
法.首先,我到標准庫路徑下面去找看看有沒有和我用的函數相關的庫,我就這樣找到了線程(thread)函數的庫文件(libpthread.a).
當然,如果找不到,只有一個笨方法.比如我要找sin這個函數所在的庫. 就只好用 nm -o /lib/*.so|grep
sin>~/sin 命令,然後看~/sin文件,到那裡面去找了.
在sin文件當中,我會找到這樣的一行libm-2.1.2.so:00009fa0 W sin 這樣我就知道了sin在
libm-2.1.2.so庫裡面,我用 -lm選項就可以了(去掉前面的lib和後面的版本標志,就剩下m了所以是 -lm).
如果你知道怎麼找,請趕快告訴我,我回非常感激的.謝謝! 4.程序的調試
我們編寫的程序不太可能一次性就會成功的,在我們的程序當中,會出現許許多多我們想不到的錯誤,這個時候我們就要對我們的程序進行調試了.
最常用的調試軟體是gdb.如果你想在圖形界面下調試程序,那麼你現在可以選擇xxgdb.記得要在編譯的時候加入
-g選項.關於gdb的使用可以看gdb的幫助文件.由於我沒有用過這個軟體,所以我也不能夠說出如何使用.
不過我不喜歡用gdb.跟蹤一個程序是很煩的事情,我一般用在程序當中輸出中間變數的值來調試程序的.當然你可以選擇自己的辦法,沒有必要去學別人的.現
在有了許多IDE環境,裡面已經自己帶了調試器了.你可以選擇幾個試一試找出自己喜歡的一個用.
5.頭文件和系統求助
有時候我們只知道一個函數的大概形式,不記得確切的表達式,或者是不記得著函數在那個頭文件進行了說明.這個時候我們可以求助系統.
比如說我們想知道fread這個函數的確切形式,我們只要執行 man fread
系統就會輸出著函數的詳細解釋的.和這個函數所在的頭文件說明了. 如果我們要write這個函數的說明,當我們執行man
write時,輸出的結果卻不是我們所需要的.
因為我們要的是write這個函數的說明,可是出來的卻是write這個命令的說明.為了得到write的函數說明我們要用 man 2 write.
2表示我們用的write這個函數是系統調用函數,還有一個我們常用的是3表示函數是C的庫函數. 記住不管什麼時候,man都是我們的最好助手.

--------------------------------------------------------------------------------
好了,這一章就講這么多了,有了這些知識我們就可以進入激動人心的Linux下的C程序探險活動.
不積跬步,無以至千里!

B. Linux系統下C語言編譯,顯示時間(800分!)

/*
*
可以任意復制修改,scenbuffalo不負任何責任!
*
中文下的話,把nian換成年,yue換成月,ri換成日就行
*
我的linux不支持中文,只好用拼音代替。:)
*/
#include
<stdio.h>
#include
<unistd.h>
#include
<time.h>
int
main()
{
while
(1)
{
char
timebuf[100];
time_t
t;
time
(&t);
strftime(timebuf,
sizeof(timebuf),
"%Y
nian
%m
yue
%d
ri
%H:%M:%S",
localtime(&t));
printf
("%s\r",
timebuf);
fflush(stdout);
sleep(1);
}
return
0;
}

C. c語言設置linux系統時間

這個得打開rtc的驅動,然後在c里對驅動的設備文件進行修改操作。然後用hwclock -s同步硬體時鍾。

D. Linux下C語言獲得系統時間的方法

沒有完整程序, 不過能提供一點資料

int gettimeofday(struct timeval * tv,struct timezone *tz);
這個函數可以獲取當前時間, 貌似只要第一個結構體就行了

struct timeval
{
time_t tv_sec; //秒 [long int]
suseconds_t tv_usec; //微秒 [long int], (10E-6 second)
};
struct timeval
{
long tv_sec;
long tv_usec;
};

然後取微秒的前三位就是小數了, 之後把秒 tv_sec 轉化為 tm 格式, 參數用秒的指針就行

struct tm * gmtime(const time_t * t);
//轉換成格林威治時間。有時稱為GMT或UTC。
struct tm * localtime(const time_t *t);
//轉換成本地時間。它可以透過修改TZ環境變數來在一台機器中,不同使用者表示不同時間.

下面是tm的部分參數

int tm_sec; //tm_sec表「秒」數,在[0,61]之間,多出來的兩秒是用來處理跳秒問題用的。/* Seconds: 0-59 (K&R says 0-61?) */
int tm_min; //tm_min表「分」數,在[0,59]之間。
int tm_hour; //tm_hour表「時」數,在[0,23]之間。
int tm_mday; //tm_mday表「本月第幾日」,在[1,31]之間。
int tm_mon; //tm_mon表「本年第幾月」,在[0,11]之間。
int tm_year; //tm_year要加1900表示那一年。 /* /* 年份,其值從1900開始 */*/
int tm_wday; //tm_wday表「本周第幾日」,在[0,6]之間。 /* Days since Sunday (0-6) */ /*其中0代表星期天,1代表星期一,以此類推 */
int tm_yday; //tm_yday表「本年第幾日」,在[0,365]之間,閏年有366日。 /*其中0代表1月1日,1代表1月2日,以此類推 */*/
int tm_isdst; //tm_isdst表是否為「日光節約時間」

------------------------------華麗麗的分割線--------------------------------------------------
由於很長時間沒編程了, 也沒有Linux環境, 我就簡單寫幾行代碼, 僅作參考

#include <stdio.h>
#include <time.h>
#include <sys/time.h>
#include<unistd.h>
//這四個不一定夠用了

struct timeval tv;
struct timezone tz;
struct tm * p_tm;
//變數沒有初始化習慣不好,不要學

gettimeofday(&tv, &tz);
p_tm = gmtime( (const time_t *)&tv.tv_sec );

字元串的組裝尤其格式問題自己解決吧
年 p_tm->tm_year+ 1900
月 p_tm->tm_mon+ 1
日 p_tm->tm_mday
時 p_tm->tm_hour+ 1
分 p_tm->tm_min+ 1
秒 p_tm->tm_sec+ 1
小數點後面的部分,注意不夠三位還是前面填充0 tv.tv_sec/1000

E. LINUX下C語言編程怎麼列印日誌

將日誌寫到文件中去,在到文件中去看日誌
例如:
int
mig_log(fmt,va_alist)
char
*fmt
;
va_dcl
{
va_list
ap
;
FILE
*fp
;
char
log_file[81]
;
struct
tm
*p_tm
;
time_t
clock
;
ap=(char
*)&va_alist
;
time(&clock)
;
p_tm=localtime(&clock)
;
sprintf(log_file,"%s/mig_%4d%.2d%.2d.log",
getenv("HOME"),
p_tm->tm_year+1900,
p_tm->tm_mon+1,
p_tm->tm_mday)
;
fp=fopen(log_file,"at")
;
if(fp==(FILE
*)0)
{
fprintf(stderr,"mig_err_log():can't
open
the
file
%s
!\n",log_file);
return
;
}
fprintf(fp,"%.2d/%.2d/%4d
%.2d:%.2d:%.2d
",
p_tm->tm_mon+1,\
p_tm->tm_mday,\
p_tm->tm_year+1900,\
p_tm->tm_hour,\
p_tm->tm_min,\
p_tm->tm_sec)
;
vfprintf(fp,fmt,ap)
;
fclose(fp)
;
}
這個就是寫日誌的函數
你這樣調用:mig_log("日誌開始[%s]->[%d]\n",__FILE__,__LINE__)
;
mig_log("日誌開始!\n")都可以的

F. linux下C語言怎麼獲取文件創建時間

在 Windows 下,一個文件有創建時間、修改時間、訪問時間。而在 Linux 下,一個文件也有三種時間,分別是訪問時間(Access)、修改時間(Modify)、狀態改變時間(Change)。

可以使用 stat 命令查看文件的訪問時間、修改時間和狀態改變時間。

本人使用的機器的磁碟分區使用的文件系統類型是 ext3,也就是說本人是無法查看文件創建時間的。但是,如果文件創建後就沒有修改過,修改時間=創建時間;如果文件創建後,狀態就沒有改變過,那麼狀態改變時間=創建時間;如果文件創建後,沒有被讀取過,那麼訪問時間=創建時間,當這個基本不太可能。

那什麼時候訪問時間,修改時間和狀態改變時間會變化呢?比如我們使用vi打開文件但不編輯,那麼退出後文件的訪問時間就會改變;比如我們使用vi打開文件並且編輯後保存退出,那麼文件的修改時間就會改變,當然訪問時間也改變了;再比如使用chmod +x給文件增加可執行的屬性,那麼文件的狀態改變時間就會改變。

【答題不易,請採納謝謝】

G. C語言程序編程題。。。。請高手做下

這是在windows下的程序,用TC編譯運行,完全可行。至於你的linux,我就不知道了。
=================
1. 程序運行後,首先在屏幕上顯示主菜單:
1. 查詢某年某月某日是星期幾
2. 查詢某年是否是閏年
3. 列印某年的全年日歷
4. 退出
2. 在主菜單中輸入1後,顯示:
「請輸入年月日(XXXX,XX,XX)」
運行後輸出:XXXX年XX月XX日是星期X,是否繼續查詢(Y/N)?
如果輸入Y,則重新顯示 「請輸入年月日(XXXX,XX,XX)」,否則回到主菜單。
3. 在主菜單中輸入2後,顯示:
「請輸入要查哪一年?(XXXX)」
運行後輸出:XXXX年是(否)是閏年,是否繼續查詢(Y/N)?
如果輸入Y,則重新顯示,「請輸入要查哪一年?(XXXX)」,否則回到主菜單。
4. 在主菜單中輸入3後,顯示:
「請輸入要列印的年份(XXXX)」
運行後輸出XXXX年的日歷
==================
一下是代碼:
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#define X " Sun Mon Tue Wed Thu Fri Sat"

void menu()
{
system("cls");
printf("\nTHIS IS THE MENU OF THE PROGRAM !");
printf("\nYOU CAN CHOOSE THE NUMBER FOR THE FUNCTIOM:");
printf("\n\n");
printf("1 Find the day by year-month-date.\n");
printf("2 Find the year you input if the leap year.\n");
printf("3 Print the calendar of the year you input.\n");
printf("4 Exit.\n\n");
printf("Input your choice:");
}

int getday(int year,int month,int date)
{
int flag,s,i;
int a[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int cont=0;
flag=isleap(year);
if(flag==1)
a[2]++;
for(i=1;i<month;i++)
{
cont=cont+a[i];
}
cont=cont+date;
s=year+1+(year-1)/4+(year-1)/100+(year-1)/400+cont;
return s%7;
}
int isleap(int year)
{
if(year%4==0&&year%100||year%400==0)
return 1;
else
return 0;
}
void print(int n)
{
int i;
for(i=0;i<n;i++) printf(" ");
}
int day(int year)
{
long a,b;
if(year<=2000)
{
a=2000-year;
b=6-(a+a/4-a/100+a/400)%7;
return b;
}
else
{
a=year-2000;
b=(a+1+(a-1)/4-(a-1)/100+(a-1)/400)%7+6;
return b%7;
}
}
void printcalendar(int year)
{
int i,j,k,m,n,f1,f2,d;
int a[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
printf("\nThe calendar of the year %d.\n\n",year);
d=day(year);
if(isleap(year)==1)
a[2]++;
for(i=1;i<=12;i+=2)
{
m=0; n=0; f1=0; f2=0;
switch(i)
{
case 1:printf(" Januray 1 ");break;
case 3:printf(" March 3 ");break;
case 5:printf(" May 5 ");break;
case 7:printf(" July 7 "); break;
case 9:printf(" September 9 ");break;
case 11:printf(" Nevember 11 ");break;
}
print(21);
switch(i+1)
{
case 2:printf(" February 2 "); break;
case 4:printf(" April 4 "); break;
case 6:printf(" June 6 "); break;
case 8:printf(" August 8 "); break;
case 10:printf(" October 10 "); break;
case 12:printf(" December 12"); break;
}
printf("\n");
printf(X);
print(6);
printf(X);
printf("\n");
for(j=0;j<6;j++)
{
if(j==0)
{
print(d*4);
for(k=0;k<7-d;k++)
{
printf("%4d",++m);
}
print(6);
d+=a[i]%7;
d%=7;
print(d*4);
for(k=0;k<7-d;k++)
{
printf("%4d",++n);
}
printf("\n");
}
else
{
for(k=0;k<7;k++)
{
if(m<a[i])
{
printf("%4d",++m);
}
else
{
print(4);
}
if(m==a[i]) f1=1;
}
print(6);
for(k=0;k<7;k++)
{
if(n<a[i+1])
{
printf("%4d",++n);
}
else
{
print(4);
}
if(n==a[i+1]) f2=1;
}
printf("\n");
if(f1&&f2) break;
}
}
d+=a[i+1]%7;
d%=7;
printf(" ");
for(k=0;k<27;k++)
{
printf("=");
}
print(6);
printf(" ");
for(k=0;k<27;k++)
{
printf("=");
}
printf("\n");
if(i==5)
{
printf("Press any key to others!");
getch();
system("cls");
}
}
}
void main()
{
int choice;
int year,month,date;
int day,flag;
char con;
menu();
scanf("%d",&choice);
if(choice==1)
{
r1:system("cls");
printf("\nPlease input the year-month-date(XXXX,XX,XX):");
scanf("%d,%d,%d",&year,&month,&date);
day=getday(year,month,date);
if(day==0)
printf("\n%d-%d-%d is Sunday!\n",year,month,date);
if(day==1)
printf("\n%d-%d-%d is Monday!\n",year,month,date);
if(day==2)
printf("\n%d-%d-%d is Tuesday!\n",year,month,date);
if(day==3)
printf("\n%d-%d-%d is Wednesday!\n",year,month,date);
if(day==4)
printf("\n%d-%d-%d is Thursday!\n",year,month,date);
if(day==5)
printf("\n%d-%d-%d is Friday!\n",year,month,date);
if(day==6)
printf("\n%d-%d-%d is Saturday!\n",year,month,date);
printf("\nContinue...(Y/N)");
con=getch();
if((con=='y')||(con=='Y'))
goto r1;
if((con=='n')||(con=='N'))
main();
}
if(choice==2)
{
r2:system("cls");
printf("\nPlease input the year(XXXX):");
scanf("%d",&year);
flag=isleap(year);
if(flag==1)
printf("\nThe year %d is leap year!\n",year);
if(flag==0)
printf("\nThe year %d is not leap year!\n",year);
printf("\nContinue...(Y/N)");
con=getch();
if((con=='y')||(con=='Y'))
goto r2;
if((con=='n')||(con=='N'))
main();
}
if(choice==3)
{
r3:system("cls");
printf("\nPlease input the year(XXXX):");
scanf("%d",&year);
printcalendar(year);
printf("Continue...(Y/N)");
con=getch();
if((con=='y')||(con=='Y'))
goto r3;
if((con=='n')||(con=='N'))
main();
}
if(choice==4)
{
system("cls");
printf("\nDo you want to Exit?(Y/N)");
con=getch();
if((con=='y')||(con=='Y'))
return;
if((con=='n')||(con=='N'))
main();
}
}

H. 如何在Linux下運行C語言程序

有三個辦法:
一、最直接的辦法,用nohup命令,將程序掛到後台。
二、最方便的辦法,用screen命令,起個虛擬終端,即使斷開連接也能繼續在後台跑。
三、最正常的思路,是將監聽程序置為daemon,直接在後台運行,具體是監聽程序啟動後,fork一個子進程,將子進程setsid,然後父進程退出,實際操作都放到子進程中。
當然程序裡面的循環結構是肯定要的。

I. linux下c語言編程

實在點,給你些命令操作操作,不過好象有點多,哈哈
Linux/Unix常用命令
1、目錄操作
和DOS相似,UNIX採用樹型目錄管理結構,由根目錄(/)開始一層層將子目錄建下去,各子目錄以 / 隔開。用戶login後,工作目錄的位置稱為 home directory,由系統管理員設定。『~』符號代表自己的home directory,例如 ~/myfile 是指自己home目錄下myfile這個文件。
(1)顯示目錄文件 ls
執行格式: ls [-atFlgR] [name] (name可為文件或目錄名稱)
例: ls 顯示出當前目錄下的文件
ls -a 顯示出包含隱藏文件的所有文件
ls -t 按照文件最後修改時間顯示文件
ls -F 顯示出當前目錄下的文件及其類型
ls -l 顯示目錄下所有文件的許可權、擁有者、文件大小、修改時間及名稱
ls -lg 同上
ls -R 顯示出該目錄及其子目錄下的文件
注:ls與其它命令搭配使用可以生出很多技巧(最簡單的如"ls -l | more"),更多用法請輸入ls --help查看,其它命令的更多用法請輸入 命令名 --help 查看.

(2)建新目錄 mkdir
執行格式: mkdir directory-name
例: mkdir dir1 (新建一名為dir1的目錄)
(3)刪除目錄 rmdir
執行格式: rmdir directory-name 或 rm directory-name
例:rmdir dir1 刪除目錄dir1,但它必須是空目錄,否則無法刪除
rm -r dir1 刪除目錄dir1及其下所有文件及子目錄
rm -rf dir1 不管是否空目錄,統統刪除,而且不給出提示,使用時要小心

(4) 改變工作目錄位置 cd
執行格式: cd [name]
例: cd 改變目錄位置至用戶login時的working directory
cd dir1 改變目錄位置,至dir1目錄
cd ~user 改變目錄位置,至用戶的working directory
cd .. 改變目錄位置,至當前目錄的上層目錄
cd ../user 改變目錄位置,至上一級目錄下的user目錄
cd /dir-name1/dir-name2 改變目錄位置,至絕對路徑(Full path)
cd - 回到進入當前目錄前的上一個目錄

(5)顯示當前所在目錄pwd
執行格式: pwd
(6)查看目錄大小
執行格式: [-s] directory
例: dir1 顯示目錄dir1及其子目錄容量(以kb為單位)
-s dir1 顯示目錄dir1的總容量
(7)顯示環境變數
echo $HOME 顯示家目錄
echo $PATH 顯示可執行文件搜索路徑
env 顯示所有環境變數(可能很多,最好用"env | more","env | grep PATH"等)
(8)修改環境變數,在bash下用export,如:
export PATH=$PATH:/usr/local/bin
想知道export的具體用法,可以用shell的help命令:help export
2、文件操作
(1)查看文件(可以是二進制的)內容 cat
執行格式:cat filename或more filename 或cat filename|more
例: cat file1 以連續顯示方式,查看文件file1的內容
more file1
或 cat file1|more 以分頁方式查看文件的內容
(2)刪除文件 rm
執行格式: rm filename
例: rm file?
rm f*
(3)復制文件 cp
執行格式: cp [-r] source destination
例: cp file1 file2 將file1復製成file2
cp file1 dir1 將file1復制到目錄dir1
cp /tmp/file1 將file1復制到當前目錄
cp /tmp/file1 file2 將file1 復制到當前目錄名為file2
cp -r dir1 dir2 (recursive )復制整個目錄。
(4)移動或更改文件、目錄名稱mv
執行格式: mv source destination
例: mv file1 file2 將文件file1,更名為file2
mv file1 dir1 將文件file1,移到目錄dir1下
mv dir1 dir2
(5)比較文件(可以是二進制的)或目錄的內容 diff
執行格式: diff [-r] name1 name2 (name1、name2同為文件或目錄)
例: diff file1 file2 比較file1與file2的不同處
diff -r dir1 dir2 比較dir1與dir2的不同處
(6)文件中字元串的查找 grep
執行格式: grep string file
例: grep abc file1 查找並列出串abc所在的整行文字
(7)文件或命令的路徑尋找
執行格式一:whereis command 顯示命令的路徑
執行格式二:which command 顯示路徑及使用者所定義的別名
執行格式三:whatis command 顯示命令的功能摘要

(8)建立文件或目錄的鏈接 ln
例: ln source target1 建立source文件(已存在)的硬鏈接,命名為target1
ln -s source target2 建立source文件的符號鏈接,命名為target2

文件編輯器vi
vi是在UNIX 上被廣泛使用的中英文編輯軟體。vi是visual editor的縮寫,是UNIX提供給用戶的一個窗口化編輯環境。
進入vi,直接執行vi編輯程序即可。
例:$vi test.c
顯示器出現vi的編輯窗口,同時vi會將文件復制一份至緩沖區(buffer)。vi先對緩沖區的文件進行編輯,保留在磁碟中的文件則不變。編輯完成後,使用者可決定是否要取代原來舊有的文件。
1、vi的工作模式
vi提供二種工作模式:輸入模式(insert mode)和命令模式(command mode)。使用者進入vi後,即處在命令模式下,此刻鍵入的任何字元皆被視為命令,可進行刪除、修改、存檔等操作。要輸入信息,應轉換到輸入模式。
(1)命令模式
在輸入模式下,按ESC可切換到命令模式。命令模式下,可選用下列指令離開vi:
:q! 離開vi,並放棄剛在緩沖區內編輯的內容
:wq 將緩沖區內的資料寫入磁碟中,並離開vi
:ZZ 同wq
:x 同wq
:w 將緩沖區內的資料寫入磁碟中,但並不離開vi
:q 離開vi,若文件被修改過,則要被要求確認是否放棄修改的內容,此指令可與:w配合使用

(2)命令模式下游標的移動
H 左移一個字元
J 下移一個字元
K 上移一個字元
L 右移一個字元
0 移至該行的首
$ 移至該行的末
^ 移至該行的第一個字元處
H 移至窗口的第一列
M 移至窗口中間那一列
L 移至窗口的最後一列
G 移至該文件的最後一列
W, W 下一個單詞 (W 忽略標點)
B, B 上一個單詞 (B 忽略標點)
+ 移至下一列的第一個字元處
- 移至上一列的第一個字元處
( 移至該句首
) 移至該句末
{ 移至該段首
} 移至該段末
NG 移至該文件的第n列
N+ 移至游標所在位置之後第n列
n- 移至游標所在位置之前第n列

(3)輸入模式
輸入以下命令即可進入vi輸入模式:
a(append) 在游標之後加入資料
A 在該行之末加入資料
i(insert) 在游標之前加入資料
I 在該行之首加入資料
o(open) 新增一行於該行之下,供輸入資料用
O 新增一行於該行之上,供輸入資料用
dd 刪除當前游標所在行
X 刪除當前游標字元
x 刪除當前游標之前字元
U 撤消
• 重做
F 查找

ESC鍵 離開輸入模式

GNU C編譯器
LINUX上可用的C編譯器是GNU C編譯器,它建立在自由軟體基金會編程許可證的基礎上,因此可以自由發布。
LINUX 上的GNU C編譯器(GCC)是一個全功能的ANCI C兼容編譯器。下面介紹GCC和一些GCC編譯器最常用的選項。
1、使用GCC
通常後跟一些選項和文件名來使用GCC編譯器。GCC命令的基本用法如下:
gcc [options] [filenames]
命令行選項指定的編譯過程中的具體操作
2、GCC常用選項
GCC有超過100個的編譯選項可用,這些選項中的許多可能永遠都不會用到,但一些主要的選項將會頻繁使用。很多的GCC選項包括一個以上的字元,因此必須為每個選項指定各自的連字元,並且就像大多數LINUX 命令一樣不能在一個單獨的連字元後跟一組選項。例如:
gcc test.c
編譯成功後,當前目錄下就產生了一個可執行文件a.out。
也可用-o選項來為即將產生的可執行文件指定一個文件名來代替a.out。例如:
gcc -o count count.c
此時得到的可執行文件就不再是a.out,而是count。
3、執行文件
格式: ./可執行文件名
例:./a.out
./count

J. 求LINUX下,C語言編寫的日誌輸出源碼~

#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <dirent.h>
#include <time.h>
#define LOGFILE "./dir_log_0"
int g_Count;
//#define MAXLEN 1024
void WriteDebugLog(char *str);
int main(int argc, char **argv)
{
char str[1024]={0};
strcpy(str,"file no find");
int i=0,j=0;
for (i=0; i<10; i++)
{
for (j=0; j<50; j++)
{
WriteDebugLog(str);
}

}
return 0;
}
void WriteDebugLog(char *str)
{
char buf[2048]={0};
char logFileName[50]={0};
//long MAXLEN = 50*1024*1024;//50MB
int iMax = 1024;//1K
time_t timep;
FILE *fp = NULL;
struct tm *p;
time(&timep);
p = localtime(&timep);
memset(buf,0,sizeof(buf));
sprintf(buf,"[%d-%d-%d %d:%d:%d][DEBUG]",(1900+p->tm_year),(1+p->tm_mon), p->tm_mday,p->tm_hour, p->tm_min, p->tm_sec); //星期p->tm_wday
strcat(buf,str);
strcat(buf," ");
strcpy(logFileName,LOGFILE);
int len = strlen(logFileName);
logFileName[len-1] = Ɔ'+g_Count;
fp = fopen(logFileName,"r");
if(fp==NULL)
{
fp = fopen(logFileName,"w+");
}
else
{
fseek(fp,0,2);//SEEK_END值為2
if( ftell(fp) >= iMax)
{
fclose(fp);

if (g_Count >= 9)
{
logFileName[len-1] = Ɔ'
g_Count=0;
}
else
{
g_Count++;
logFileName[len-1] = Ɔ'+g_Count;
// printf(" %c",Ɔ'+g_Count);
}
fp = fopen(logFileName,"w+");
}
else
{
fclose(fp);
fp = fopen(logFileName,"a");
}
}
fwrite(buf,1,strlen(buf),fp);
fclose(fp);
}