c語言與編譯指令有哪些
編譯,編譯程序讀取源程序(字元流),對之進行詞法和語法的分析,將高級語言指令轉換為功能等效的匯編代碼,再由匯編程序轉換為機器語言,並且按照操作系統對可執行文件格式的要求鏈接生成可執行程序。
如果用一張圖來表示:
讀取c源程序,對其中的偽指令(以#開頭的指令)和特殊符號進行處理
[析] 偽指令主要包括以下四個方面
(1)宏定義指令,如#define Name TokenString,#undef等。對於前一個偽指令,預編譯所要做的是將程序中的所有Name用TokenString替換,但作為字元串常量的Name則不被替換。對於後者,則將取消對某個宏的定義,使以後該串的'出現不再被替換。
(2)條件編譯指令,如#ifdef,#ifndef,#else,#elif,#endif,等等。這些偽指令的引入使得程序員可以通過定義不同的宏來決定編譯程序對哪些代碼進行處理。預編譯程序將根據有關的文件,將那些不必要的代碼過濾掉
(3)頭文件包含指令,如#include "FileName"或者#include 等。在頭文件中一般用偽指令#define定義了大量的宏(最常見的是字元常量),同時包含有各種外部符號的聲明。採用頭文件的目的主要是為了使某些定義可以供多個不同的C源程序使用。因為在需要用到這些定義的C源程序中,只需加上一條#include語句即可,而不必再在此文件中將這些定義重復一遍。預編譯程序將把頭文件中的定義統統都加入到它所產生的輸出文件中,以供編譯程序對之進行處理。
包含到c源程序中的頭文件可以是系統提供的,這些頭文件一般被放在/usr/include目錄下。在程序中#include它們要使用尖括弧(<>)。另外開發人員也可以定義自己的頭文件,這些文件一般與c源程序放在同一目錄下,此時在#include中要用雙引號("")。
(4)特殊符號,預編譯程序可以識別一些特殊的符號。例如在源程序中出現的LINE標識將被解釋為當前行號(十進制數),FILE則被解釋為當前被編譯的C源程序的名稱。預編譯程序對於在源程序中出現的這些串將用合適的值進行替換。
注意:
預編譯程序所完成的基本上是對源程序的「替代」工作。經過此種替代,生成一個沒有宏定義、沒有條件編譯指令、沒有特殊符號的輸出文件。這個文件的含義同沒有經過預處理的源文件是相同的,但內容有所不同。下一步,此輸出文件將作為編譯程序的輸出而被翻譯成為機器指令。
② 求大神整理c語言指令符號及用法大全。
編譯指令
編譯指令
說明
#include
包含另一個文件
#define
定義一個宏(macro)或是常量
#undef
取消一個宏常量的定義
#asm和#endasm
在程序中加入匯編語言的程序
#ifdef、#ifndef、#else、#endif
用於條件式的編譯
註解://—單行註解;
基本數據類型 (int,float,double,char,void)
數據類型
類型說明
長度(位)
數據長度
bit
位
1
0,1
char
字元
8
—128~127
unsigned char
無符號字元
8
0~255
signed char
有符號字元
8
—128~127
int
整型
16
—32768~32767
short int
短整型
16
—32768~32767
unsigned int
無符號整型
16
0~65535
signed int
有符號整型
16
—32768~32767
long int
長整型
32
—2147483648~2147483647
unsigned long int
無符號長整型
32
0~4294967295
signed long int
有符號長整形
32
—2147483648~2147483647
float
浮點數(實數)
32
0.175e-38~0.402e38
double
雙精度浮點
32
0.175e-38~0.402e38
void
空
0
沒任何數據
用戶自定義數據類型格式
typedef struct{
數據類型 變數序列1;
數據類型 變數序列1;
...
}自定義數據類型的名稱;
保留字
_at_,alien,bdata,break,bit,case,char,code,compact,const,continue,data,
default,do,double,far,else,enum,extern,float,for,goto,if,funcused,idata,int,
inline,interrupt,large,long,pdata,_priority_,reentrant,return,sbit,sfr,sfr16,
short,sigend,sizeof,small,static,struct,switchc_task_,typedef,using,union,
unsigned,void,volatile,while,xdata
常量表示法
常數
規則
範例
十進制
一般十進制格式
1234567890
二進制
開頭加上0b
0b00001110
八進制
開頭加上O
O0123
十六進制
開頭加上0x
0xFF45
無符號整數常量
結尾加上U
30000U
長整數常量
結尾加上L
299L
無符號長整數常量
結尾加上UL
327800UL
浮點數的常量
結尾加上F
4.234F
字元常量
以單引號括起來
『a』
字元串常量
以雙引號括起來
「hello」
-----------------------------------------------------運算符-----------------------------------------------------
算術運算
運算符
說明
範例
執行結果
+
加
c=a+b;
c 等於10
—
減
d=a—b;
d 等於6
*
乘
e=a*b;
e 等於16
/
除
f=a/b;
f 等於4
%
取余數
g=a%b;
g 等於0
++
加1
c++;相當於c=c+1;
c 等於11
——
減1
d——;相當於d=d—1;
d 等於5
=
等於
a=8;
設置a等於8
+=
先相加在等於
e+=5;相當於e=e+5;
e 等於21
—=
先相減在等於
f—=5;相當於f=f—5;
f 等於—1
*=
先相乘在等於
b*=5;相當於b=b*5;
b 等於0
/=
先相除在等於
a/=5;相當於a=a/5;
a 等於1
%=
先取余數在等於
a%=5;相當於a=a%5;
a 等於3
※假設a等於8,b等於2
比較運算
運算符
說明
範例
執行結果
==
等於
a==5
F
!=
不等於
a!=5
T
<<o:p>
小於
a<5
F
>
大於
a>5
T
<=
小於等於
a<=5
F
>=
大於等於
a>=5
T
※比較運算結果是個布爾值既TRUE(真值)或FALSE(假值)。假設a等於8
邏輯運算
運算符
說明
範例
執行結果
&&
AND
(a>5)&&(a<10)
T
||
OR
(a<5)||(a>10)
F
!
NOT
!(a>10)
T
※邏輯運算結果是個布爾值既TRUE(真值)或FALSE(假值)。假設a等於8
位邏輯運算
運算符
說明
範例
執行結果
&
AND
a&0x01
a等於1
|
OR
a|0x80
a等於0x85
~
NOT
~a
a等於0xFA
^
XOR
a^0xFF
a等於0xFA
<<
左移
a<<1
a等於0x0A
>>
右移
a>>1
a等於0x0A
※假設a等於5
----------------------------------------------------控制命令---------------------------------------------------
if語句
if(條件) 語句1;
else 語句2;
例:if(d==4) d=0; //如果d等於4就設置d等於0
else d++; //否則就將d加1
if(ticks==0) { //如果ticks等於0
ticks=1000; //ticks 設置成1000
counter[0]++; //counter[0]加1
}
嵌套if語句
例:if(counter[0]==10) {
counter[1]++;
counter[0]=0;
if(counter[1]==10) {
counter[2]++;
counter[1]=0;
}
}
switch語句
switch (變數) {
case 常量1:語句1; break;
case 常量2:語句2; break;
case 常量3:語句3; break;
......
default ; 語句n;
}
for循環
for (初值,條件,變化值) 語句;
例:for(i=0;i<10;i++) x=x+i;
for(i=1;i<10,i++)
for(j=1;j<10,j++)
printf(「%d %d」,i,j);
無窮循環:
for( ; ; );
while循環
while (條件) 語句;
例:while (ch!=!』A』) ch=getche();
無窮循環:
while(1);
do/while循環
do {
語句;
...
} while(條件);
例:do {
ch=getche();
} while (ch!=」A」);
goto語句
loop1:
x++;
if(x<100) goto loop1;
----------------------------------------------------指針和函數------------------------------------------------
指針的定義
數據類型 *指針變數的名字;
例: char *p;
int *x;
指針與數組
例: char filename[80];
char *p;
p=filename; //指針p存放filename的開始地址
int x[5]={1,2,3,4,5};
int *p,sum,i;
p=x; //指針p存放數組x的開始地址
for(i=0;i<5;i++)
sum=sum+p[i]; //p[i]相當於x[i]
指針的運算
1.針變數前面加上*號就是取得指針所指向位置的內容。
例:int x[5]={1,2,3,4,5};
int *p;
p=x; //指針p存放數組x的開始地址
*p=10; //相當於設置x[0]等於10
2.變數前面加上&符號,可以取得一個變數的位置。
例:int x,y;
int *p;
p=&x; //指針p存放x的地址,相當於p是指向x 的指針
*p=1; //相當於設置x等於1
3.&符號也可以加在數組的前面
例:int x[5];
int *p;
p=&x[2]; //指針p存放x[2]的地址,相當於p是指向x[2]的指針
*p=50; //相當於設置x[2]等於50
函數
函數類型 函數名稱(參數序列);
參數說明
{
函數的主體
}
例:void delay (void) { //不返回任何數據的函數
unsigned char i,j; //沒有任何參數的函數
for(i=0,i<255,i++)
for(j=0,j<255,j++);
}
main()
{
...
delay(); //調用函數
}
例:unsigned char sum(unsigned chat a,unsigned chat b)
{
unsigned chat x;
check_GLCD_busyflag(); //函數中可以調用另一個函數
x=a+b;
return x; //return會返回x的數據
}
中斷服務函數
void 中斷服務程序的名稱(void) interrupt 中斷號碼using 寄存器組號碼
{
中斷服務子程序主體
}
中斷號碼
#define IE0_VECTOR 0 //0x03
#define TF0_VECTOR 1 //0x0B
#define IE1_VECTOR 2 //0x13
#define TF1_VECTOR 3 //0x1B
#define SIO_VECTOR 4 //0x23
對於S51有定時器2
#define TF2_VECTOR 5 //0x2B
例:static void xint0_isr(void) interrupt IE0_VECTOR(或0) using 1
{
unsigned char i,j=0xFF;
for(i=0,i<16,i++)
{
j++;
P1=j; //將數值輸出到P1口
delay_4isr();
}
}
-----------------------------------------------------匯編語言--------------------------------------------------
在C中加入匯編語言
例:void delay100us()
{
#pragma asm
mov r7,#1
more: mov r3,#48
djnz r3,$
djnz r7,more
#pragma endasm
}
----------------------------------------------------宏(macro)----------------------------------------------
宏的定義
%*define (macro名稱) (macro的指令)
例:%*define (write_1) (
setb DI
serb SK
clr SK
)
#define 宏的名稱 宏的指令
例:#define uchar unsigned char
C語言中的符號總結
運算符的種類C語言的運算符可分為以下幾類;
1. 算術運算符
用於各類數值運算,包括加減乘除求余自增自減共七種運算
{ ( + ) ,( - ),(* ) ,( / ) ,( % ),( ++ ),(-- )}。
2. 關系運算符
用於比較運算,包括大於(>),小於(<</span>),等於(==),大於等於(>=),
小於等於(<=),不等於(!=)共六種。
3.邏輯運算符
用於邏輯運算,包括與(&&)或(||)非(!)三種.
4.位操作運算符
參與運算的量,按二進制位進行運算,包括:
位與(&),位或(|),位非(~),為異或(^),左移(<<),右移(>>)共六種。
5.賦值運算符
用於賦值運算,分為:
簡單賦值(=)
復合算術賦值(+=,-=,*=,/=,%=)
復合位運算賦值(&=,|=,^=,>>=,<<=)三類共十一種。
6.條件運算符
這是一個三目運算符,用於條件求值(?:)。
7.逗號運算符
用於把若干表達式組合成一個表達式(,)。
8.指針運算符
用於取內容(*)和取地址(&)兩種運算。
9.求位元組數運算符
用於計算數據類型所佔用的位元組數(sizeof)。
10.特殊運算符
有括弧(),下標[],成員(→, .)
1.C的數據類型
基本類型,構造類型,指針類型,空類型
2.基本類型的分類及特點
類型說明符 位元組 數值范圍
字元型char 1 C字元集
基本整型int 2 -32768~32767
短整型short int 2 -32768~32767
長整型 long int 4 -214783648~214783647
無符號型 unsigned 2 0~65535
無符號長整型 unsigned long 4 0~4294967295
單精度實型 float 4 3/4E-38~3/4E+38
雙精度實型 double 8 1/7E-308~1/7E+308
3.常量後綴
L或l 長整型
U或u 無符號數
F或f 浮點數
4.常量類型
整數,長整數,無符號數,浮點數,字元,字元串,符號常數,轉義字元。
5.數據類型轉換
a自動轉換
在不同類型數據的混合運算中,由系統自動實現轉換, 由少位元組類型向多位元組類型轉換。 不同類型的量相互賦值時也由系統自動進行轉換,把賦值號右邊的類型轉換為左邊的類型。
b強制轉換
由強制轉換運算符完成轉換。
6.運算符優先順序和結合性
一般而言,單目運算符優先順序較高,賦值運算符優先順序低。 算術運算符優先順序較高,關系和邏輯運算符優先順序較低。 多數運算符具有左結合性,單目運算符、三目運算符、 賦值
7.表達式
表達式是由運算符連接常量、變數、函數所組成的式子。 每個表達式都有一個值和類型。 表達式求值按運算符的優先順序和結合性所規定的順序進行。
表示輸出類型的格式字元 格式字元意義
d 以十進制形式輸出帶符號整數(正數不輸出符號)
o 以八進制形式輸出無符號整數(不輸出前綴O)
x 以十六進制形式輸出無符號整數(不輸出前綴OX)
u 以十進制形式輸出無符號整數
f 以小數形式輸出單、雙精度實數
e 以指數形式輸出單、雙精度實數
g 以%f%e中較短的輸出寬度輸出單、雙精度實數
c 輸出單個字元
s 輸出字元串
標志字元為-、+、#、空格四種,其意義下表所示:
標志格式字元 標 志 意 義
- 結果左對齊,右邊填空格
+ 輸出符號(正號或負號)空格輸出值為正時冠以空格,為負時冠以負號
# 對c,s,d,u類無影響;對o類, 在輸出時加前
綴o 對x類,在輸出時加前綴0x;對e,g,f 類當結果有小數時才給出小數點
格式字元串
格式字元串的一般形式為: %[*][輸入數據寬度][長度]類型 其中有方括弧[]的項為任選項。各項的意義如下:
1.類型
表示輸入數據的類型,其格式符和意義下表所示。
格式 字元意義
d 輸入十進制整數
o 輸入八進制整數
x 輸入十六進制整數
u 輸入無符號十進制整數
f或e 輸入實型數(用小數形式或指數形式)
c 輸入單個字元
s 輸入字元串
轉義字元
轉義字元是一種特殊的字元常量。轉義字元以反斜線」\」開頭,後跟一個或幾個字元。轉義字元具有特定的含義,不同於字元原有的意義,故稱「轉義」字元。例如,在前面各例題printf函數的格式串中用到的「\n」就是一個轉義字元,其意義是「回車換行」。轉義字元主要用來表示那些用一般字元不便於表示的控制代碼。
常用的轉義字元及其含義
轉義字元 轉義字元的意義
\n 回車換行
\t 橫向跳到下一製表位置
\v 豎向跳格
\b 退格
\r 回車
\f 走紙換頁
\\ 反斜線符」\」
\』 單引號符
\a 鳴鈴
\ddd 1~3位八進制數所代表的字元
\xhh 1~2位十六進制數所代表的字元
廣義地講,C語言字元集中的任何一個字元均可用轉義字元來表示。表2.2中的\ddd和\xhh正是為此而提出的。ddd和hh分別為八進制和十六進制的ASCII代碼。如\101表示字?quot;A」 ,\102表示字母」B」,\134表示反斜線,\XOA表示換行等。轉義字元的使用
在C語言中,對變數的存儲類型說明有以下四種:
auto 自動變數
register 寄存器變數
extern 外部變數
static 靜態變數
自動變數和寄存器變數屬於動態存儲方式, 外部變數和靜態變數屬於靜態存儲方式。在介紹了變數的存儲類型之後, 可以知道對一個變數的說明不僅應說明其數據類型,還應說明其存儲類型。 因此變數說明的完整形式應為: 存儲類型說明符 數據類型說明符 變數名,變數名…; 例如:
static int a,b; 說明a,b為靜態類型變數
auto char c1,c2; 說明c1,c2為自動字元變數
static int a[5]={1,2,3,4,5}; 說明a為靜整型數組
extern int x,y; 說明x,y為外部整型變數
與指針有關的各種說明和意義見下表。
int *p; p為指向整型量的指針變數
int *p[n]; p為指針數組,由n個指向整型量的指針元素組成。
int (*p)[n]; p為指向整型二維數組的指針變數,二維數組的列數為n
int *p() p為返回指針值的函數,該指針指向整型量
int (*p)() p為指向函數的指針,該函數返回整型量
int **p p為一個指向另一指針的指針變數,該指針指向一個整型量。
指針變數的賦值
p可以有以下兩種方式:
(1)指針變數初始化的方法 int a;
int *p=&a;
(2)賦值語句的方法 int a;
int *p;
p=&a;
(1)取地址運算符&
(2)取內容運算符*
③ linux 怎麼編譯c的源程序的gcc,編譯命令是什麼
在Linux下面,如果要編譯一個C語言源程序,我們要使用gcc編譯器。
先將源文件編譯成目標文件:gcc - c hello.c
生成hello.o文件,再將目標文件編譯成可執行文件:gcc -o hello hello.o
如:
int main(int argc,char **argv)
{
printf("Hello Linux ");
}
(3)c語言與編譯指令有哪些擴展閱讀:
在使用GCC編譯器的時候,我們必須給出一系列必要的調用參數和文件名稱。GCC編譯器的調用參數大約有100多個,這里只介紹其中最基本、最常用的參數。具體可參考GCC Manual。
GCC最基本的用法是∶gcc [options] [filenames]
其中options就是編譯器所需要的參數,filenames給出相關的文件名稱。
網路_gcc
④ linux 怎麼編譯c的源程序的gcc,編譯命令是什麼
在Linux下面,如果要編譯一個C語言源程序,我們要使用gcc編譯器。
先將源文件編譯成目標文件:gcc - c hello.c
生成hello.o文件,再將目標文件編譯成可執行文件:gcc -o hello hello.o
如:
int main(int argc,char **argv)
{
printf("Hello Linux ");
}
(4)c語言與編譯指令有哪些擴展閱讀:
在使用GCC編譯器的時候,我們必須給出一系列必要的調用參數和文件名稱。GCC編譯器的調用參數大約有100多個,這里只介紹其中最基本、最常用的參數。具體可參考GCC Manual。
GCC最基本的用法是∶gcc [options] [filenames]
其中options就是編譯器所需要的參數,filenames給出相關的文件名稱。
網路_gcc
⑤ 在cmd中輸入哪幾句話把c語言編譯和運行出來
1.打開命令行界面:鍵盤win+r,輸入CMD,回車。您可以打開命令行。
⑥ C語言的編譯和運行按什麼鍵
編譯F9 運行Ctrl+F9
不同的編譯器命令快捷鍵略有不同。
下面是Visual Stdio的命令快捷鍵列表:
CTRL + SHIFT + B
生成解決方案
CTRL + F7
生成編譯
CTRL + O
打開文件
CTRL + SHIFT + O
打開項目
CTRL + SHIFT + C
顯示類視圖窗口
F4
顯示屬性窗口
SHIFT + F4
顯示項目屬性窗口
CTRL + SHIFT + E
顯示資源視圖
F12
轉到定義
CTRL + F12
轉到聲明
CTRL + ALT + J
對象瀏覽
CTRL + ALT + F1
幫助目錄
CTRL + F1
動態幫助
F1
幫助
SHIFT + F1
當前窗口幫助
CTRL + ALT + F3
幫助-搜索
SHIFT + ALT + ENTER
全屏顯示
CTRL + -
向後定位
CTRL + SHIFT + -
向前定位
CTRL + F4
關閉文檔窗口
CTRL + PAGE DOWN
游標定位到窗口上方
CTRL + PAGE UP
游標定位到窗口下方
CTRL + F6
CTRL + TAB
下一個文檔窗口
CTRL + SHIFT + F6
CTRL + SHIFT + TAB
上一個文檔窗口
ALT + F6
下一個面板窗口
CTRL + K, CTRL + L
取消remark
CTRL + K, CTRL + C
注釋選擇的代碼
CTRL + K, CTRL + U
取消對選擇代碼的注釋
CTRL + M, CTRL + O
折疊代碼定義
CTRL + M, CTRL + L
展開代碼定義
CTRL + DELETE
刪除至詞尾
CTRL + BACKSPACE
刪除至詞頭
SHIFT + TAB
取消製表符
CTRL + U
轉小寫
CTRL + SHIFT + U
轉大寫
CTRL + SHIFT + END
選擇至文檔末尾
CTRL + SHIFT + HOME
選擇至文檔末尾開始
SHIFT + END
選擇至行尾
SHIFT + HOME
選擇至行開始處
SHIFT + ALT + END
垂直選擇到最後尾
SHIFT + ALT + HOME
垂直選擇到最前面
CTRL + A
全選
CTRL + W
選擇當前單詞
CTRL + SHIFT + PAGE UP
選擇至本頁前面
CTRL + SHIFT + PAGE DOWN
選擇至本頁後面
CTRL + END
文檔定位到最後
CTRL + HOME
文檔定位到最前
CTRL + G
轉到…
CTRL + K, CTRL + P
上一個標簽
CTRL + K, CTRL + N
下一個標簽
ALT + F10
調試-ApplyCodeChanges
CTRL + ALT+ Break
停止調試
CTRL + SHIFT + F9
取消所有斷點
CTRL + F9
允許中斷
CTRL + SHIFT + F5
調試-重新開始
F5
運行調試
CTRL + F5
運行不調試
F10
跨過程序執行
F11
單步逐句執行
CTRL + J
列出成員
CTRL + PAGE DOWN
下一個視圖
CTRL + B
格式-粗體
CTRL + SHIFT + T
格式-文字縮進
⑦ c語言指令有哪些啊
第一章:緒論?
內核版本號格式:x.y.zz-www/x為主版本號,y為次版本號,zz為次次版本號,www為發行號/次版本號改變說明內核有重大變革,其偶數為穩定版本,奇數為尚在開發中的版本
第二章:基礎?
文件種類:-:txt,二進制/d:目錄/l:鏈接文件(link)/b:區塊設備文件/c:字元設備文件/p:管道
目錄結構:bin:可執行/boot:開機引導/dev:設備文件/etc:系統配置文件/lib:庫文件/mnt:設備掛載點/var:系統日誌/
命令:rmdir:刪除空目錄/find [path] [expression]/touch命令還可以修改指定文件的最近一次訪問時間/tar -czvf usr.tar.gz path/tar –zxvf usr.tar.gz/tar –cjvf usr.tar.bz2 path/tar –jxvf usr.tar.bz2
gcc:預處理:-g/I在頭文件搜索路徑中添加目錄,L在庫文件搜索路徑中
gdb:設置斷點:b/查看斷點信息:info
Makefile:make –f other_makefile/<:第一個依賴文件的名稱/@:目標文件的完整名稱/^:所有不重復的依賴文件/+:所有依賴文件(可能重復)
第三章:文件IO
read:read(fd, temp, size); /讀fd中長度為size的值到temp/返回0表示file為NULL
write:write(fd, buf, buf_size); /寫長度為buf_size的buf內容到fd中
lseek:lseek(fd, offset, SEEK_SET); /從文件開頭向後增加offset個位移量
unlink:從文件系統中刪除一個名字
open1:int open(const char * pathname, int flags, mode_t mode);/flags為讀寫方式/mode為許可權設置/O_EXCL:測試文件是否存在/O_TRUNC:若存在同名文件則刪除之並新建
open2:注意O_NONBLOCK
mmap.1:void *mmap(void *start, size_t length, int prot, int flags, int fd, off_t offsize);
mmap.2:mmap(start_addr, flength, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);
fcntl:上鎖/int fcntl(int fd, int cmd, struct flock * lock);/對誰;做什麼;設置所做內容
select:fd_max+1,回傳讀狀況,回傳寫狀況,回傳異常,select等待的時間/NULL為永遠等待/0為從不等待/凡需某狀況則用之,反則(fd_set *)NULL之
FD_*那幾個函數……
一般出錯則返回-1
第四章:文件與目錄
硬鏈接與符號鏈接?
chdir改變目錄
0:in/1:out/2:err
第五章:內存管理
可執行文件存儲時:代碼區、數據區和未初始化區
棧:by編譯器,向低址擴展,連續,效率高/堆:by程序員
/etc/syslog.conf,系統log記錄文件/優先順序為-20時最高
第六章:進程和信號
程序代碼、數據、變數、文件描述符和環境/init的pid為1
execl族:int execl(const char * path, const char * arg, ....);/path即可執行文件的路徑,一般為./最後一個參數以NULL結束
waitpid:waitpid(pid_t pid,int * status,int options);/option:一般用WNOHANG,沒有已經結束的子進程則馬上返回,不等待
kill:int kill(pid_t pid,int sig);/發送信號sig給pid
void (*signal(int signum, void(* handler)(int)))(int);/第一個參數被滿足時,執行handler/第一個參數常用:SIG_IGN:忽略信號/SIG_DFL:恢復默認信號
第七章:線程
sem_init(sem_t *sem, int pshared, unsigned int value)/pshared為0/value即初始值
第八章:管道
1:write/0:read
第九章:信號量、共享內存和消息隊列
臨界資源:操作系統中只允許一個進程訪問的資源/臨界區:訪問臨界資源的那段代碼
信號量:建立聯系(semget),然後初始化,PV操作,最後destroy
共享內存沒有提供同步機制
第十章:套接字
UDP:無連接協議,無主客端的區分/實時性
TCP:位元組流/數據可靠性/網路可靠性
數據報:SOCK_STREAM/SOCK_DGRAM
其它
管道一章的both_pipe即父子進程間的全雙工管道通訊
關繫到信號和互斥的伺服器-客戶端程序
線程一章的class的multi_thread文件夾下的thread8.c
int main(void)
{
int data_processed;
int file_pipes_1[2];
int file_pipes_2[2];
char buffer[BUFSIZ + 1];
const char some_data[] = "123";
const char ch2p[] = "this is the string from child to the parent!";
const char p2ch[] = "this is the string from parent to the child!";
pid_t fork_result;
memset(buffer,'\0',sizeof(buffer));
if(pipe(file_pipes_1) == 0){
if(pipe(file_pipes_2) == 0){
fork_result = fork();
switch(fork_result){
case -1:
perror("fork error");
exit(EXIT_FAILURE);
case 0://child
close(file_pipes_1[1]);
close(file_pipes_2[0]);
printf("in the child!\n");
read(file_pipes_1[0],buffer, BUFSIZ);
printf("in the child, read_result is \"%s\"\n",buffer);
write(file_pipes_2[1],ch2p, sizeof(ch2p));
printf("in the child, write_result is \"%s\"\n",ch2p);
exit(EXIT_SUCCESS);
default://parent
close(file_pipes_1[0]);
close(file_pipes_2[1]);
printf("in the parent!\n");
write(file_pipes_1[1], p2ch, sizeof(p2ch));
printf("in the parent, write_result is \"%s\"\n",p2ch);
read(file_pipes_2[0],buffer, BUFSIZ);
printf("in the parent, read_result is \"%s\"\n",buffer);
exit(EXIT_SUCCESS);
}
}
}
}
#ifndef DBG
#define DBG
#endif
#undef DBG
#ifdef DBG
#define PRINTF(fmt, args...) printf("file->%s line->%d: " \
fmt, __FILE__, __LINE__, ##args)
#else
#define PRINTF(fmt, args...) do{}while(0);
#endif
int main(void)
{
PRINTF("%s\n", "hello!");
fprintf(stdout, "hello hust!\n");
return 0;
}
#define N 5
#define MAX 5
int nput = 0;
char buf[MAX][50];
char *buffer = "";
char buf_r[100];
sem_t mutex,full,avail;
void *proctor(void *arg);
void *consumer(void *arg);
int i = 0;
int main(int argc, char **argv)
{
int cnt = -1;
int ret;
int nput = 0;
pthread_t id_proce[10];
pthread_t id_consume;
ret = sem_init(&mutex, 0, 1);
ret = sem_init(&avail, 0, N);
ret = sem_init(&full, 0, 0);
for(cnt = 0; cnt < 6; cnt ++ ){
//pthread_create(&id_proce[cnt], NULL, (void *)proctor, &cnt);
pthread_create(&id_proce[cnt], NULL, (void *)proctor, (void *)cnt);
}
pthread_create(&id_consume, NULL, (void *)consumer, NULL);
for(cnt = 0; cnt < 6; cnt ++){
pthread_join(id_proce[cnt], NULL);
}
pthread_join(id_consume,NULL);
sem_destroy(&mutex);
sem_destroy(&avail);
sem_destroy(&full);
exit(EXIT_SUCCESS);
}
void *proctor(void *arg)
{
while(1){
sem_wait(&avail);
sem_wait(&mutex);
if(nput >= MAX * 3){
sem_post(&avail);
//sem_post(&full);
sem_post(&mutex);
return NULL;
}
sscanf(buffer + nput, "%s", buf[nput % MAX]);
//printf("write[%d] \"%s\" to the buffer[%d]\n", (*(int*)arg), buf[nput % MAX],nput % MAX);
printf("write[%d] \"%s\" to the buffer[%d]\n", (int)arg, buf[nput % MAX],nput % MAX);
nput ++;
printf("nput = %d\n", nput);
sem_post(&mutex);
sem_post(&full);
}
return NULL;
}
void *consumer(void *arg)
{
int nolock = 0;
int ret, nread, i;
for(i = 0; i < MAX * 3; i++)
{
sem_wait(&full);
sem_wait(&mutex);
memset(buf_r, 0, sizeof(buf_r));
strncpy(buf_r, buf[i % MAX], sizeof(buf[i % MAX]));
printf("read \"%s\" from the buffer[%d]\n\n",buf_r, i % MAX);
sem_post(&mutex);
sem_post(&avail);
//sleep(1);
}
return NULL;
}
⑧ C++ if()是不是條件編譯指令
if()屬於判斷語句,不是條件編譯指令。
與if類似的條件編譯指令為#if和#ifdef。
條件編譯指令屬於預編譯語句,即編譯器在執行編譯工作時,會第一步處理預編譯語句,之後再進行剩餘的編譯工作。
在C語言中,所有的預編譯語句都是以#開頭的,如#define, #undef,#if等等。
條件編譯指令包括以下幾項:
1 #if
當後續的參數為真時執行編譯。
2 #ifdef/#ifndef
#ifdef當後續的宏定義被定義時執行編譯。
#ifndef當後續的宏定義沒有被定義時執行編譯。
3 #elif
與C語言語句中的else if類似,與#if或#ifdef連用,當後續參數為真時執行編譯。
4 #endif
用於條件編譯結尾,表示條件編譯結束。
⑨ 如何用c語言進行編輯運行和保存用那幾個命令
TC2.0
(1)、File(文件)菜單
按Alt+F可進入File菜單, 該菜單包括以下內容:
.Load(載入)
裝入一個文件, 可用類似DOS的通配符(如*.C)來進行列表選擇。也可裝入其它
擴展名的文件, 只要給出文件名(或只給路徑)即可。該項的熱鍵為F3, 即只要在主
菜單中按F3即可進入該項, 而不需要先進入File菜單再選此項。
.Pick(選擇)
將最近裝入編輯窗口的8個文件列成一個表讓用戶選擇, 選擇後將該程序裝入
編輯區, 並將游標置在上次修改過的地方。其熱健為Alt-F3。
.New(新文件)
說明文件是新的, 預設文件名為NONAME.C, 存檔時可改名。
.Save(存檔)
將編輯區中的文件存檔, 若文件名是NONAME.C時, 將詢問是否更改文件名, 其
熱鍵為F2。
(2)、Edit(編輯)菜單
按Alt+E可進入編輯菜單, 若再回車, 則游標出現在編輯窗口, 此時用戶可以
進行文本編輯。
(3)Run(運行)菜單
按Alt+R可進入Run菜單, 該菜單有以下各項:
.Run(運行程序)
運行由Project/Project name項指定的文件名或當前編輯區的文件。如果對上
次編譯後的源代碼未做過修改, 則直接運行到下一個斷點(沒有斷點則運行到結束)。
否則先進行編譯、連接後才運行, 其熱鍵為Ctrl+F9。
(4)、Compile(編譯)菜單
按Alt+C可進入Compile菜單, 該菜單有以下幾個內容:
.Compile to OBJ(編譯生成目標碼)
將一個C源文件編譯生成.OBJ目標文件, 同時顯示生成的文件名。其熱鍵為
Alt+F9。
具體見這篇文章
http://www.cnblogs.com/lyss/archive/2006/06/22/432613.html
Turbo C 2.0集成開發環境的使用
進入Turbo C 2.0集成開發環境中後, 屏幕上顯示:
——————————————————————————————
File Edit Run Compile Project Options Debug Break/watch
┌————————————Edit——————————————┐
│ Line 1 Col 1 Insert Indent Tab File Unindent c:NONAME.C│
│ │
│ │
│ │
│ │
│ │
│ │
│ │
│—————————Message——————————————— │
│ │
│ │
└————————————————————————————┘
F1-Help F5-Zoom F6-Switch F7-Trace F8-Step F9-Make F10-Menu
———————————————————————————————
其中頂上一行為Turbo C 2.0 主菜單, 中間窗口為編輯區, 接下來是信息窗
口, 最底下一行為參考行。這四個窗口構成了Turbo C 2.0的主屏幕, 以後的編程、
編譯、調試以及運行都將在這個主屏幕中進行。下面詳細介紹主菜單的內容。
1 主菜單
主菜單 在Turbo C 2.0主屏幕頂上一行, 顯示下列內容:
File Edit Run Compile Project Options Debug Break/watch
除Edit外, 其它各項均有子菜單, 只要用Alt加上某項中第一個字母(即大寫字
母), 就可進入該項的子菜單中。
(1)、File(文件)菜單
按Alt+F可進入File菜單, 該菜單包括以下內容:
.Load(載入)
裝入一個文件, 可用類似DOS的通配符(如*.C)來進行列表選擇。也可裝入其它
擴展名的文件, 只要給出文件名(或只給路徑)即可。該項的熱鍵為F3, 即只要在主
菜單中按F3即可進入該項, 而不需要先進入File菜單再選此項。
.Pick(選擇)
將最近裝入編輯窗口的8個文件列成一個表讓用戶選擇, 選擇後將該程序裝入
編輯區, 並將游標置在上次修改過的地方。其熱健為Alt-F3。
.New(新文件)
說明文件是新的, 預設文件名為NONAME.C, 存檔時可改名。
.Save(存檔)
將編輯區中的文件存檔, 若文件名是NONAME.C時, 將詢問是否更改文件名, 其
熱鍵為F2。
.Write to(存檔)
可由用戶給出文件名將編輯區中的文件存檔, 若該文件已存在, 則詢問要不要
覆蓋。
.Directory(目錄)
顯示目錄及目錄中的文件, 並可由用戶選擇。
.Change dir(改變目錄)
顯示當前目錄, 用戶可以改變顯示的目錄。
.Os shell(暫時退出)
暫時退出Turbo C 2.0到DOS提示符下, 此時可以運行DOS 命令, 若想回到
Turbo C 2.0中, 只要在DOS狀態下鍵入EXIT即可。
.Quit(退出)
退出Turbo C 2.0, 返回到DOS操作系統中, 其熱鍵為Alt+X。
說明:
以上各項可用游標鍵移動色棒進行選擇, 回車則執行。也可用每一項的第一個
大寫字母直接選擇。若要退到主菜單或從它的下一級菜單列表框退回均可用Esc鍵,
Turbo C 2.0所有菜單均採用這種方法進行操作, 以下不再說明。
(2)、Edit(編輯)菜單
按Alt+E可進入編輯菜單, 若再回車, 則游標出現在編輯窗口, 此時用戶可以
進行文本編輯。
編輯方法基本與wordstar相同, 可用F1鍵獲得有關編輯方法的幫助信息。
與編輯有關的功能鍵如下:
F1 獲得Turbo C 2.0編輯命令的幫助信息
F5 擴大編輯窗口到整個屏幕
F6 在編輯窗口與信息窗口之間進行切換
F10 從編輯窗口轉到主菜單
編輯命令簡介:
PageUp 向前翻頁
PageDn 向後翻頁
Home 將游標移到所在行的開始
End 將游標移到所在行的結尾
Ctrl+Y 刪除游標所在的一行
Ctrl+T 刪除游標所在處的一個詞
Ctrl+KB 設置塊開始
Ctrl+KK 設置塊結尾
Ctrl+KV 塊移動
Ctrl+KC 塊拷貝
Ctrl+KY 塊刪除
Ctrl+KR 讀文件
Ctrl+KW 存文件
Ctrl+KP 塊文件列印
Ctrl+F1 如果游標所在處為Turbo C 2.0庫函數, 則獲得有關該函數的幫助
信息
Ctrl+Q[ 查找Turbo C 2.0雙界符的後匹配符
Ctrl+Q] 查找Turbo C 2.0雙界符的前匹配符
說明:
a. Turbo C 2.0的雙界符包括以下幾種符號:
花括符 {和}
尖括符 <和>
圓括符 (和)
方括符 [和]
注釋符 /*和*/
雙引號 "
單引號 '
b. Turbo C 2.0在編輯文件時還有一種功能, 就是能夠自動縮進, 即游標定位
和上一個非空字元對齊。在編輯窗口中, Ctrl+OL為自動縮進開關的控制鍵。
(3)Run(運行)菜單
按Alt+R可進入Run菜單, 該菜單有以下各項:
.Run(運行程序)
運行由Project/Project name項指定的文件名或當前編輯區的文件。如果對上
次編譯後的源代碼未做過修改, 則直接運行到下一個斷點(沒有斷點則運行到結束)。
否則先進行編譯、連接後才運行, 其熱鍵為Ctrl+F9。
.Program reset(程序重啟)
中止當前的調試, 釋放分給程序的空間, 其熱鍵為Ctrl+F2。
.Go to cursor(運行到游標處)
調試程序時使用, 選擇該項可使程序運行到游標所在行。游標所在行必須為一
條可執行語句, 否則提示錯誤。其熱鍵為F4。
.Trace into(跟蹤進入)
在執行一條調用其它用戶定義的子函數時, 若用Trace into項, 則執行長條將
跟蹤到該子函數內部去執行, 其熱鍵為F7。
.Step over(單步執行)
執行當前函數的下一條語句, 即使用戶函數調用, 執行長條也不會跟蹤進函數
內部, 其熱鍵為F8。
.User screen(用戶屏幕)
顯示程序運行時在屏幕上顯示的結果。其熱鍵為Alt+F5。
(4)、Compile(編譯)菜單
按Alt+C可進入Compile菜單, 該菜單有以下幾個內容:
.Compile to OBJ(編譯生成目標碼)
將一個C源文件編譯生成.OBJ目標文件, 同時顯示生成的文件名。其熱鍵為
Alt+F9。
.Make EXE file(生成執行文件)
此命令生成一個.EXE的文件, 並顯示生成的.EXE文件名。其中.EXE文件名是下
面幾項之一。
a. 由Project/Project name說明的項目文件名。
b. 若沒有項目文件名, 則由Primary C file說明的源文件。
c. 若以上兩項都沒有文件名, 則為當前窗口的文件名。
.Link EXE file(連接生成執行文件)
把當前.OBJ文件及庫文件連接在一起生成.EXE文件。
.Build all(建立所有文件)
重新編譯項目里的所有文件, 並進行裝配生成.EXE文件。該命令不作過時檢查
(上面的幾條命令要作過時檢查, 即如果目前項目里源文件的日期和時間與目標文
件相同或更早, 則拒絕對源文件進行編譯)。
.Primary C file(主C文件)
當在該項中指定了主文件後, 在以後的編譯中, 如沒有項目文件名則編譯此項
中規定的主C文件, 如果編譯中有錯誤, 則將此文件調入編輯窗口, 不管目前窗口
中是不是主C文件。
.Get info(獲得有關當前路徑、源文件名、源文件位元組大小、編譯中的錯誤數
目、可用空間等信息。
(5)、Project(項目)菜單
按Alt+P可進入Project菜單, 該菜單包括以下內容:
.Project name(項目名)
項目名具有.PRJ的擴展名, 其中包括將要編譯、連接的文件名。例如有一個程
序由file1.c, file2.c, file3.c組成, 要將這3個文件編譯裝配成一個file.exe的
執行文件, 可以先建立一個file.prj的項目文件, 其內容如下:
file1.c
file2.c
file3.c
此時將file.prj放入Project name項中, 以後進行編譯時將自動對項目文件中
規定的三個源文件分別進行編譯。然後連接成file.exe文件。
如果其中有些文件已經編譯成.OBJ文件, 而又沒有修改過, 可直接寫上.OBJ擴
展名。此時將不再編譯而只進行連接。
例如: file1.obj
file2.c
file3.c
將不對file1.c進行編譯, 而直接連接。
說明:
當項目文件中的每個文件無擴展名時, 均按源文件對待, 另外, 其中的文件也
可以是庫文件, 但必須寫上擴展名.LIB。
.Break make on(中止編譯)
由用戶選擇是否在有Warining(警告)、Errors(錯誤)、Fatal Errors( 致命錯
誤)時或Link(連接)之前退出Make編譯。
.Auto dependencies(自動依賴)
當開關置為on, 編譯時將檢查源文件與對應的.OBJ文件日期和時間, 否則不進
行檢查。
.Clear project(清除項目文件)
清除Project/Project name中的項目文件名。
.Remove messages(刪除信息)
把錯誤信息從信息窗口中清除掉。
(6)、Options(選擇菜單)
按Alt+O可進入Options菜單, 該菜單對初學者來說要謹慎使用。
.Compiler(編譯器)
本項選擇又有許多子菜單, 可以讓用戶選擇硬體配置、存儲模型、調試技術、
代碼優化、對話信息控制和宏定義。這些子菜單如下:
Model
共有Tiny, small, medium, compact, large, huge 六種不同模式可由同戶選
擇。
Define
打開一個宏定義框, 同戶可輸入宏定義。多重定義可同分號, 賦值可用等號。
Code generation
它又有許多任選項, 這些任選項告訴編譯器產生什麼樣的目標代碼。
Calling convention 可選擇C或Pascal方式傳遞參數。
Instruction set 可選擇8088/8086或80186/80286指令系列。
Floating point 可選擇模擬浮點、數學協處理器浮點或無浮點運算。
Default char type 規定char的類型。
Alignonent 規定地址對准原則。
Merge plicate strings 作優化用, 將重復的字元串合並在一起。
Standard stack frame 產生一個標準的棧結構。
Test stack overflow 產生一段程序運行時檢測堆棧溢出的代碼。
Line number 在.OBJ文件中放進行號以供調試時用。
OBJ debug information 在.OBJ文件中產生調試信息。
Optimization
Optimize for 選擇是對程序小型化還是對程序速度進行優
化處理。
Use register variable 用來選擇是否允許使用寄存器變數。
Register optimization 盡可能使用寄存器變數以減少過多的取數操
作。
Jump optimization 通過去除多餘的跳轉和調整循環與開關語句
的辦法, 壓縮代碼。
Source
Indentifier length 說明標識符有效字元的個數, 默認為32個。
Nested comments 是否允許嵌套注釋。
ANSI keywords only 是只允許ANSI關鍵字還是也允許Turbo C
2.0關鍵字
Error
Error stop after 多少個錯誤時停止編譯, 默認為25個。
Warning stop after 多少個警告錯誤時停止編譯, 默認為100個。
Display warning
Portability warning 移植性警告錯誤。
ANSI Violations 侵犯了ANSI關鍵字的警告錯誤。
Common error 常見的警告錯誤。
Less common error 少見的警告錯誤。
Names 用於改變段(segment)、 組( group) 和類
(class)的名字, 默認值為CODE,DATA,BSS。
.Linker(連接器)
本菜單設置有關連接的選擇項, 它有以下內容:
Map file menu 選擇是否產生.MAP文件。
Initialize segments 是否在連接時初始化沒有初始化的段。
Devault libraries 是否在連接其它編譯程序產生的目標文件時去尋
找其預設庫。
Graphics library 是否連接graphics庫中的函數。
Warn plicate symbols 當有重復符號時產生警告信息。
Stack warinig 是否讓連接程序產生No stack的警告信息。
Case-sensitive link 是否區分大、小寫字。
.Environment(環境)
本菜單規定是否對某些文件自動存檔及製表鍵和屏幕大小的設置
Message tracking
Current file 跟蹤在編輯窗口中的文件錯誤。
All files 跟蹤所有文件錯誤。
Off 不跟蹤。
Keep message 編譯前是否清除Message窗口中的信息。
Config auto save 選on時, 在Run, Shell或退出集成開發環境之前,
如果Turbo C 2.0的配置被改過, 則所做的改動
將存入配置文件中。選off時不存。
Edit auto save 是否在Run或Shell之前, 自動存儲編輯的源文件。
Backup file 是否在源文件存檔時產生後備文件(.BAK文件)。
Tab size 設置製表鍵大小, 默認為8。
Zoomed windows 將現行活動窗口放大到整個屏幕, 其熱鍵為F5。
Screen size 設置屏幕文本大小。
.Directories(路徑)
規定編譯、連接所需文件的路徑, 有下列各項:
Include directories 包含文件的路徑, 多個子目錄用";"分開。
Library directories 庫文件路徑, 多個子目錄用";"分開。
Output directoried 輸出文件(.OBJ, .EXE, .MAP文件)的目錄。
Turbo C directoried Turbo C 所在的目錄。
Pick file name 定義載入的pick文件名, 如不定義則從current
pick file中取。
.Arguments(命令行參數)
允許用戶使用命令行參數。
.Save options(存儲配置)
保存所有選擇的編譯、連接、調試和項目到配置文件中, 預設的配置文件為
TCCONFIG.TC。
.Retrive options
裝入一個配置文件到TC中, TC將使用該文件的選擇項。
(7)、Debug(調試)菜單
按Alt+D可選擇Debug菜單, 該菜單主要用於查錯, 它包括以下內容:
Evaluate
Expression 要計算結果的表達式。
Result 顯示表達式的計算結果。
New value 賦給新值。
Call stack 該項不可接觸。而在Turbo C debuger 時用於檢
查堆棧情況。
Find function 在運行Turbo C debugger時用於顯示規定的函數。
Refresh display 如果編輯窗口偶然被用戶窗口重寫了可用此恢復
編輯窗口的內容。
(8)、Break/watch(斷點及監視表達式)
按Alt+B可進入Break/watch菜單, 該菜單有以下內容:
Add watch 向監視窗口插入一監視表達式。
Delete watch 從監視窗口中刪除當前的監視表達式。
Edit watch 在監視窗口中編輯一個監視表達式。
Remove all watches 從監視窗口中刪除所有的監視表達式。
Toggle breakpoint 對游標所在的行設置或清除斷點。
Clear all breakpoints 清除所有斷點。
View next breakpoint 將游標移動到下一個斷點處。
VC之類的IDE就簡單多了。
VC compiler ctrl + F7
build F7
buildexecute ctrl + F5