-
【錯(cuò)誤流】 我們將程序進(jìn)行一些修改,如下: #include <stdio.h> int main() { printf("input the int value i:\n"); int i, j; scanf("%d", &i); printf("input the int value j:\n"); scanf("%d", &j); if(0!=j){ printf("%d/%d=%d\n",i,j,i/j); }else{ fprintf(stderr, "j != 0\n"); return 1; } return 0; } 對(duì)程序進(jìn)行編譯cc main.c,得到./a.out,分別根據(jù)提示輸入8和4得到結(jié)果“8/4=2”,我們使用命令echo $?,得到0說(shuō)明程序正常輸入,下面我們來(lái)測(cè)試一下錯(cuò)誤流,再次執(zhí)行程序./a.out,我們輸入8和0,并使用echo $?命令得到返回值為1,則有錯(cuò)誤流顯示的結(jié)果“j != 0”。 我們能否將正確和錯(cuò)誤的結(jié)果分別倒入(寫(xiě)文件的方式)到不同的文件中去呢?命令我們寫(xiě)./a.out 1>t.txt 2>f.txt,正確的導(dǎo)入到t.txt中,錯(cuò)誤的導(dǎo)入到f.txt。同樣地,我們還可以把輸入流加到剛才的命令中去。 根據(jù)以上講的,有: 標(biāo)準(zhǔn)輸入流 ==> 鍵盤(pán)輸入 標(biāo)準(zhǔn)輸出流 ==> 終端輸出 標(biāo)準(zhǔn)錯(cuò)誤流 ==> 錯(cuò)誤輸出 我們?cè)俳Y(jié)合通道,就可以寫(xiě)出有實(shí)際意義的命令來(lái)。查看全部
-
【編寫(xiě)使用管道的程序】 我們?cè)谖募A下,c語(yǔ)言做的每個(gè)程序都有一個(gè)獨(dú)立的功能,我們可以將多個(gè)小程序使用管道連接到一起。 我們現(xiàn)在寫(xiě)一個(gè)程序avg.c,求任意個(gè)數(shù)的平均值: #include <stdio.h> int main() { int s, n; scanf("%d,%d", &s, &n); float v = s / n; printf("v = %f\n", v); return 0; } 退出vim進(jìn)行編譯cc avg.c -o avg.out,我們得到avg.out,我們輸入3000,3。 我們?cè)賹?xiě)一個(gè)統(tǒng)計(jì)輸入的程序input.c: #include <stdio.h> int main() { int flag = 1; int i; int count = 0; int s = 0; while(flag){ scanf("%d", &i); if(0==i) break; count++; s+=i; } printf("%d,%d\n",s,count); return 0; } 我們對(duì)這個(gè)函數(shù)進(jìn)行編譯cc input.c -o input.out,我們輸入3000 2000 0,輸出總工資5000和人數(shù)2。 我們不妨使用以上兩個(gè)程序結(jié)合起來(lái),將所有數(shù)據(jù)進(jìn)行統(tǒng)計(jì)input.out,之后通過(guò)管道經(jīng)過(guò)avg.out計(jì)算平均值,命令可以寫(xiě)為./input.out | ./avg.out,然后進(jìn)行輸入,輸入完成我們便得到了對(duì)應(yīng)的平均工資。 以上就是通過(guò)管道,將兩個(gè)小程序連接起來(lái)得到更復(fù)雜的程序的過(guò)程。查看全部
-
【管道原理及應(yīng)用】 Linux系統(tǒng)自帶的小工具如何使用,其實(shí)這些小工具就是一個(gè)應(yīng)用程序,比方說(shuō)ls /查看根目錄,比方我們要查找某個(gè)目錄下有多少個(gè)文件名包含“ab”,我們可以寫(xiě)ls /etc/ | grep ab,其中這個(gè)豎線就是管道的意思,grep是從文本文檔中查找指定的行(其實(shí)可用于文本搜索)。 將我們前一個(gè)程序執(zhí)行輸出流,通過(guò)管道得到我們需要的內(nèi)容。通過(guò)管道我們就可以使用很多自動(dòng)化的方法,管道的應(yīng)用還有很多。 例如,ps可以查看當(dāng)前的進(jìn)程,我們想查看我們當(dāng)前操作系統(tǒng)是否開(kāi)啟ssh進(jìn)程,我們可以使用命令ps -e | grep ssh,查看所有進(jìn)程中是否包含ssh服務(wù)的,若有我們便可以進(jìn)行連接。查看全部
-
1.cp 拷貝查看全部
-
【main函數(shù)中的參數(shù)】 我們使用命令cp main.c main2,c,復(fù)制并創(chuàng)建一個(gè)main2.c文件: #include <stdio.h> int main(int argv, char* argv[]) { print("argv is %d \n", argv); return 0; } 我們?cè)谑褂妹頲c main2.c -o m2.out進(jìn)行編譯,執(zhí)行./m2.out命令,有“argv is 1” 對(duì)于ls我們可以在此命令上加參數(shù),例如: 顯示更多的文件信息:ls -l 顯示隱藏的文件信息:ls -a 那么,同理,我們也可以對(duì)./m2.out這個(gè)可執(zhí)行文件加參數(shù)。分別執(zhí)行如下命令并觀察輸出: ./m2.out,輸出為“argv is 1” ./m2.out -l,輸出為“argv is 2” ./m2.out -l -a,輸出為“argv is 3” 我們可以觀察到,加不同個(gè)數(shù)的參數(shù),argv返回對(duì)應(yīng)參數(shù)的值,我們不僅要知道幾個(gè)參數(shù),我們還可以知道每個(gè)參數(shù)是什么,我們將程序進(jìn)行修改,加上如下一段代碼: int i; for(i=0; i<argv; i++) {//在vs或者xcode里,可以在for內(nèi)聲明int i,但是在c98下不能這么寫(xiě),會(huì)報(bào)錯(cuò),是因?yàn)榘姹镜膯?wèn)題 printf("argc[%d] is %s\n", i, argc[i]); } 這時(shí),我們?cè)倬幾ggcc main2.c -o m3.out,運(yùn)行./m3.out -l -a asadf sdfd有如下顯示: argv is 5 argc[0] is ./m2.out argc[1] is -l argc[2] is -a argc[3] is asadf argc[4] is sdfd 以上內(nèi)容和linux,unix聯(lián)系非常緊密,尤其是在linu嵌入式,linux小工具的開(kāi)發(fā),以及l(fā)inux的網(wǎng)絡(luò)編程,都是很重要的內(nèi)容。查看全部
-
【輸入流重定向】 我們可以創(chuàng)建一個(gè)文件vi input,txt,內(nèi)容如下: 6 8 我們?cè)俅螆?zhí)行./a,out < input.txt,不存在追加模式,所以我們用單箭頭<,我們可以將要輸入的內(nèi)容全部在input.txt中準(zhǔn)備好,命令執(zhí)行后,我們便在終端上可以看到結(jié)果。查看全部
-
【輸入輸出流以及錯(cuò)誤流的重定向機(jī)制】 Linux幾乎可以用于任何領(lǐng)域,這里我們不得不提出linux的通道,管道起到了很重要的作用,不同應(yīng)用程序之間要配合使用,就需要用到管道。 我們這里先給出一個(gè)例子main.c,主要介紹輸入流,輸出流和錯(cuò)誤流的重定向機(jī)制,對(duì)于管道的理解會(huì)比較容易些。 #include <stdio.h> int main() { printf("input the int value i:\n"); \\printf其實(shí)對(duì)fprintf的封裝,是從標(biāo)準(zhǔn)輸出流(即stdout)來(lái)輸出這個(gè)過(guò)程 scanf("%d", &i); //默認(rèn)輸入流是鍵盤(pán) printf("input the int value j:\n"); scanf("%d", &j); printf("i+j=%d\n", i+j); } 執(zhí)行命令編譯cc main.c,得到a.out,運(yùn)行a.out,我們分別輸入3和5輸入到終端。我們標(biāo)準(zhǔn)輸出流是1,輸出入是0。我們可以使用命令./a.out 1>> a.txt,其中>>符號(hào)(不寫(xiě)參數(shù)就是輸出流),之前默認(rèn)輸出流是終端,現(xiàn)在我們則改為輸出到a.txt中,我們執(zhí)行命令后,分別輸入3回車(chē)后再輸入5。再使用命令cat a.txt,我們可以看到我們已經(jīng)輸出到文件里的內(nèi)容。 我們?cè)俅螆?zhí)行./a.out >> a.txt,我們?cè)俅屋斎雲(yún)?shù),完成后我們?cè)俅问褂胏at來(lái)查看a.txt文件里的內(nèi)容,發(fā)現(xiàn)之前的內(nèi)容還在,新的輸出內(nèi)容追加到了后面。 再舉一個(gè)重定向的例子,我們使用命令ls /etc >> etc.txt,我們將ls目錄下的內(nèi)容輸入到了etc.txt文件中;但我們?nèi)缛舾闹囟ㄏ蚍?hào)想覆蓋掉之前的內(nèi)容,可以把雙箭頭>>改為單箭頭>,則文件中先前的內(nèi)容就會(huì)被覆蓋掉。查看全部
-
【標(biāo)準(zhǔn)輸入流,輸出流,錯(cuò)誤流】 現(xiàn)在有cio.c文件: #include <stdio.h> //標(biāo)準(zhǔn)輸入輸出 /* stdin stdout stderr */ int main() { printf("hello world!\n"); //輸出功能由標(biāo)準(zhǔn)輸出流完成,printf是系統(tǒng)封裝后的 int a; scanf("%d", &a); //標(biāo)準(zhǔn)輸入流,錯(cuò)誤流是系統(tǒng)出錯(cuò)的時(shí)候的 printf("input value is : %d\n", a); return 0; } 在我們輸入a.out時(shí),當(dāng)程序執(zhí)行的一瞬間,系統(tǒng)給程序提供了一個(gè)進(jìn)程,當(dāng)程序啟動(dòng)時(shí),系統(tǒng)也提供給程序一系列的指針。linux將所有的外設(shè)(攝像頭,打印機(jī)云云)也罷等等,都視為文件。當(dāng)啟動(dòng)應(yīng)用程序時(shí)候,也當(dāng)文件操作,會(huì)產(chǎn)生三個(gè)文件(stdin,stdout,stderr,即標(biāo)準(zhǔn)輸入,輸出,錯(cuò)誤流)。 默認(rèn)情況下,輸入流就是鍵盤(pán),stdout也可以切換默認(rèn)為顯示器,我們可以切換為網(wǎng)卡或者打印機(jī),錯(cuò)誤流同理。我們?cè)趩?dòng)文件的時(shí)候,都會(huì)產(chǎn)生這三個(gè)文件。 printf函數(shù)是一個(gè)封裝過(guò)的函數(shù): printf("Please input the value a:\n"); fprintf(stdout, "please input the value a:\n"); 因?yàn)閟tdout默認(rèn)是顯示器,上兩句就是等價(jià)的,printf其實(shí)就是fprintf封裝后得到的。 同樣,我們也有scanf和fscanf的關(guān)系(下面兩句是等價(jià)的): scanf("%d", &a); fscanf(stdin, "%d", &a); 同樣,我們也有錯(cuò)誤流: if(a<0){ fprintf(stderr, "the value must > 0\n"); return 1; } return 0; 如何讓程序知道出錯(cuò)了,我們通過(guò)返回值1和0體現(xiàn),再次編譯cc cio.c -o a2.out,我們運(yùn)行a2.out,輸入2則正常執(zhí)行,當(dāng)輸入-1,則有我們對(duì)應(yīng)的提示,即錯(cuò)誤流就發(fā)揮作用了。 其實(shí)Linux一個(gè)很大的系統(tǒng),就是由這些類(lèi)似的小工具完成的,當(dāng)?shù)扔?是為正確,錯(cuò)的話為其他值。當(dāng)然,標(biāo)準(zhǔn)的輸入流,輸出流,以及錯(cuò)誤流也可以重定向。查看全部
-
【關(guān)于return 0和命令連接符&&】 我們分別對(duì)main.c程序進(jìn)行修改(return后一個(gè)為0,一個(gè)為101),分別生成main.o和main2.o文件。 return 0:gcc main.c -o main.o return 101:gcc main.c -o main2.o 之后我們使用命令./main.o && ls和./main2.o && ls,發(fā)現(xiàn)前者即返回hello world!同時(shí)顯示了當(dāng)前的目錄(其中l(wèi)s為顯示當(dāng)前目錄命令),但是后者卻只返回hello world!,即&&符號(hào)后面的語(yǔ)句沒(méi)有執(zhí)行。我們兩個(gè)命令執(zhí)行后,分別執(zhí)行echo $?命令,前者返回0,后者返回101。 我們知道&&是and操作,需要前一句執(zhí)行正確才能執(zhí)行and(即&&)后面的內(nèi)容。對(duì)于上面的那個(gè)例子,我們不禁可以推斷出,0在linux下即為(程序執(zhí)行)正確的意思,因此才會(huì)執(zhí)行&&后面的ls命令。查看全部
-
【更深入了解c語(yǔ)言在linux下的交互】 建立一個(gè)main.c文件 #include <stdio.h> int main(int argv, char* argc[]) { printf("hello world!\n"); return 0; } 我們使用命令 gcc main.c -o main.out && ./main.out linux通過(guò)&&符號(hào)將兩個(gè)指令作為一個(gè)指令輸出了,但是linux是如何確定第一條指令是否正確輸出了呢? 我們?cè)俅问褂?/main.out,然后可以使用命令echo $?,若返回0則說(shuō)明程序正常,但是若為別的數(shù)字則說(shuō)明程序執(zhí)行失敗了,返回的是一個(gè)錯(cuò)誤碼(好比windows下藍(lán)屏了,就會(huì)返回一個(gè)錯(cuò)誤碼)。 返回正確則會(huì)返回0,是因?yàn)槲覀兊某绦蚶锩孀詈髮?xiě)的是return 0,但當(dāng)我們將這個(gè)return 0改為reutrn 101后,我們?cè)偈褂弥噶頴cho $?,發(fā)現(xiàn)返回的是101。查看全部
-
假設(shè)有很多.c以及.o文件的時(shí)候,我們就需要gcc后面跟一串.c文件等等,那么我們是否有很方便的命令來(lái)提高效率呢? make工具就可以很清晰和快速的將文件進(jìn)行整理,make內(nèi)部使用了gcc。 首先我們檢查一個(gè)我們是否安裝了make工具(使用命令 make -v,若安裝則顯示安裝信息,版本號(hào)碼,若未安裝,我們使用命令sudo apt-get install make)。 我們約定一個(gè)文件makefile來(lái)進(jìn)行我們之前寫(xiě)過(guò)的文件進(jìn)行配置。 makefile文件中可以寫(xiě)注釋?zhuān)跃?hào)開(kāi)頭。 hello.out是我們的目標(biāo)文件,但其中需要max.o,min.o,hello.c這三個(gè)文件,我們?cè)趍akefile寫(xiě)下: # this is make file。注意 hello.out:max.o min.o hello.c gcc max.o min.o hello.c # 同時(shí)我們寫(xiě)出max.o的文件來(lái)源 max.o:max.c gcc -c max.c min.o:min.c gcc -c min.c 刪除以o為后綴的文件:rm *.o 最上面的文件是我們最終需要的文件hello.out,同時(shí)它是由max.o,min.o,hello.c,同時(shí)我們?cè)俳o出這三個(gè)文件鎖依賴(lài)的文件(其實(shí)就是遞歸),找到各自的生成的源頭文件。若最后我們沒(méi)有在gcc中指定輸出名稱(chēng),則最后使用make命令(也就是直接命令make回車(chē)),就生成a.out文件,若要指定生成的文件名,我們就可以使用修改Makefile文件內(nèi)的代碼(改為gcc max.o min.o hello.c -o hello.out)。 此外,還需要注意的是,在Makefile文件中,我們gcc命令前需要有6個(gè)空格(即一個(gè)TAB鍵),若不是6個(gè)空格,則在使用make命令時(shí),則會(huì)報(bào)錯(cuò)導(dǎo)致無(wú)法生成out文件等。查看全部
-
如果是別人提供的o文件,我們無(wú)從知道該o文件原本對(duì)應(yīng)的c文件的函數(shù)輸入輸出是什么(cat max.o,我們無(wú)法看到文件內(nèi)容,因?yàn)槭菣C(jī)器碼),對(duì)此,在我們建立o文件的時(shí)候,我們可以(模仿stdlib.h的形式)同時(shí)寫(xiě)一個(gè)h文件。 例如,我們先對(duì)max.c文件使用gcc命令生成max.o文件,然后創(chuàng)建一個(gè)max.h文件(vim max.h),然后在這個(gè)文件里寫(xiě)上int max(int a, int b);,同時(shí)在我們的主函數(shù)文件main.c中加上#include "max.h";(別人在使用我們寫(xiě)過(guò)的max函數(shù)的時(shí)候,即便不知道函數(shù)執(zhí)行的具體內(nèi)容但能看到這個(gè)函數(shù)需要什么樣的傳遞參數(shù)和返回值類(lèi)型)。在編譯的時(shí)候,我們使用命令 gcc max.o max.h main.c。查看全部
-
我們可以將max.c和min.c分別用gcc命令(gcc max.c -o max.o和gcc min.c -o min.o)編譯成max.o和min.o,我們平時(shí)可以將平時(shí)很少改動(dòng)的函數(shù)編譯成靜態(tài)庫(kù),提高效率,需要編譯時(shí),我們直接gcc max.o max.o main.c即可。我們可以將max.c和min.c分別用gcc命令(gcc max.c -o max.o和gcc min.c -o min.o)編譯成max.o和min.o,我們平時(shí)可以將平時(shí)很少改動(dòng)的函數(shù)編譯成靜態(tài)庫(kù),提高效率,需要編譯時(shí),我們直接gcc max.o max.o main.c即可。查看全部
-
拷貝命令:cp max.c min,c,將文件max.c拷貝一份為min.c 我們可以將max.c和min.c分別用gcc命令(gcc max.c -o max.o和gcc min.c -o min.o)編譯成max.o和min.o,我們平時(shí)可以將平時(shí)很少改動(dòng)的函數(shù)編譯成靜態(tài)庫(kù),提高效率,需要編譯時(shí),我們直接gcc max.o max.o main.c即可。查看全部
-
返回到上面的vim分欄:Ctrl+w+↑ 9dd(代碼占九行,剪切代碼) 函數(shù)黏貼p 退出:wqa(a即所有,所有文件都退出并保存) 兩個(gè)文件編譯:gcc max.c hello.c -o main.out -o后面是輸出文件的名稱(chēng) 我們應(yīng)該在程序#include <stdio.h>下面聲明包含max函數(shù)的文件(加上#include "max.c",這句相當(dāng)于將max.c文件復(fù)制黏貼進(jìn)hello.c文件中),這時(shí),我們就可以不需要編譯兩個(gè)文件,只需gcc hello.c即可得到輸出文件。查看全部
舉報(bào)
0/150
提交
取消