新聞中心
:從入門到實踐

成都創(chuàng)新互聯(lián)專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于網(wǎng)站設(shè)計制作、成都做網(wǎng)站、從江網(wǎng)絡(luò)推廣、小程序定制開發(fā)、從江網(wǎng)絡(luò)營銷、從江企業(yè)策劃、從江品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運營等,從售前售中售后,我們都將竭誠為您服務(wù),您的肯定,是我們最大的嘉獎;成都創(chuàng)新互聯(lián)為所有大學(xué)生創(chuàng)業(yè)者提供從江建站搭建服務(wù),24小時服務(wù)熱線:18980820575,官方網(wǎng)址:www.cdcxhl.com
Linux作為一款開源的操作系統(tǒng),在服務(wù)器領(lǐng)域被廣泛應(yīng)用。其中,命令行工具在Linux系統(tǒng)中扮演著至關(guān)重要的角色,能夠通過命令行工具,完成大量系統(tǒng)操作任務(wù),例如文件操作、進程管理、網(wǎng)絡(luò)配置等。C語言是一種高效的編程語言,而且在Linux系統(tǒng)下有很好的兼容性,因此,本文將詳細(xì)介紹如何使用,包括開發(fā)環(huán)境的搭建、Linux下C語言程序的編寫過程、Makefile的使用等,旨在幫助讀者快速掌握Linux命令行工具的開發(fā)技能。
一、開發(fā)環(huán)境搭建
在進行Linux下C語言程序開發(fā)前,需要先搭建好相應(yīng)的開發(fā)環(huán)境。下面,介紹如何搭建所需的開發(fā)環(huán)境。
1. 安裝Linux系統(tǒng)
需要在計算機上安裝Linux系統(tǒng)。如果沒有安裝過Linux系統(tǒng),可以選擇常見的發(fā)行版,例如Ubuntu、CentOS等。安裝方法和步驟可通過搜索引擎獲取。
2. 安裝GCC編譯器
GCC是一款開源的編譯器套件,包括C、C++等編譯器,可以在Linux系統(tǒng)下進行安裝。在終端中輸入以下命令即可安裝:
“`
sudo apt-get install gcc
“`
3. 安裝開發(fā)環(huán)境
Linux下還需要一些開發(fā)環(huán)境的支持,如標(biāo)準(zhǔn)C庫、頭文件等。可以通過以下命令安裝:
“`
sudo apt-get install build-essential
“`
二、Linux下C語言程序的編寫
當(dāng)開發(fā)環(huán)境搭建完成后,就可以進行C語言程序的編寫了。下面,通過一個簡單的示例來介紹如何編寫Linux下的C語言程序。
1. 編寫Hello World程序
在終端中輸入以下命令,創(chuàng)建一個名為test.c的C程序源文件:
“`
vi test.c
“`
打開test.c文件后,輸入以下代碼:
“`c
#include
int mn(){
printf(“Hello, World!\n”);
return 0;
}
“`
保存文件并退出編輯器,然后使用以下命令編譯程序:
“`
gcc test.c -o test
“`
執(zhí)行編譯后的程序,運行以下命令:
“`
./test
“`
輸出如下內(nèi)容:
“`
Hello, World!
“`
2. 通過命令行參數(shù)處理
在Linux系統(tǒng)中,命令行工具的參數(shù)通常是通過命令行參數(shù)來傳遞的。下面使用一個示例來說明如何通過命令行參數(shù)處理數(shù)據(jù)。
打開test.c文件,修改代碼如下:
“`c
#include
#include
int mn(int argc, char *argv[]){
if(argc != 2){
printf(“usage: %s filename\n”, argv[0]);
exit(1);
}
printf(“open file:%s\n”, argv[1]);
return 0;
}
“`
上述程序需要讀取一個文件名,然后打開文件。如果用戶沒有輸入文件名,程序會輸出相應(yīng)的提示信息。
編譯程序并執(zhí)行,使用以下命令:
“`
gcc test.c -o test
./test test.txt
“`
其中,test.txt是一個存在的文件名。輸出如下內(nèi)容:
“`
open file:test.txt
“`
三、使用Makefile簡化編譯過程
在Linux下,使用Makefile可以簡化C語言程序的編譯過程,避免手動執(zhí)行編譯命令的繁瑣。下面,通過一個示例來介紹Makefile的使用方法。
1. 創(chuàng)建Makefile
在終端中輸入以下命令,創(chuàng)建一個名為Makefile的文件:
“`
vi Makefile
“`
打開Makefile后,輸入以下代碼:
“`makefile
CC = gcc
all: testutils
testutils: test.o utils.o
$(CC) -o testutils test.o utils.o
test.o: test.c utils.h
$(CC) -c test.c
utils.o: utils.c utils.h
$(CC) -c utils.c
clean:
rm -f testutils test.o utils.o
“`
上述代碼中,CC定義了編譯器的類型,all是一個偽目標(biāo),testutils是程序的目標(biāo)名,test.o和utils.o是依賴目標(biāo)文件,后面的三個命令是用來編譯程序和生成目標(biāo)文件的。
2. 編寫源文件
在同一目錄下,創(chuàng)建test.c和utils.c源文件。test.c的內(nèi)容如下:
“`c
#include
#include
#include “utils.h”
int mn(int argc, char *argv[]){
if(argc != 2){
printf(“usage: %s filename\n”, argv[0]);
exit(1);
}
print_file(argv[1]);
return 0;
}
“`
utils.c的內(nèi)容如下:
“`c
#include
void print_file(char *filename){
FILE *fp = NULL;
char buf[1024];
fp = fopen(filename, “r”);
while(fgets(buf, 1024, fp) != NULL){
printf(“%s”, buf);
}
fclose(fp);
}
“`
其中,utils.c中的print_file函數(shù)用來打開一個文件名并讀取文件內(nèi)容。
3. 編譯程序
使用以下命令來編譯程序:
“`
make
“`
執(zhí)行完該命令后,會生成一個名為testutils的可執(zhí)行程序。在終端中運行以下命令:
“`
./testutils Makefile
“`
即可看到Makefile的內(nèi)容被輸出到終端中。
四、
通過上述步驟,我們能夠基本掌握使用的方法。在開發(fā)過程中,需要注意編程規(guī)范和良好的編寫習(xí)慣;同時,還需要熟練運用Linux系統(tǒng)提供的系統(tǒng)調(diào)用函數(shù)和庫函數(shù),以便更加高效地進行命令行工具的開發(fā)。
參考文獻:
1. Linux命令大全. https://man.linuxde.net/
成都網(wǎng)站建設(shè)公司-創(chuàng)新互聯(lián),建站經(jīng)驗豐富以策略為先導(dǎo)10多年以來專注數(shù)字化網(wǎng)站建設(shè),提供企業(yè)網(wǎng)站建設(shè),高端網(wǎng)站設(shè)計,響應(yīng)式網(wǎng)站制作,設(shè)計師量身打造品牌風(fēng)格,熱線:028-86922220linux下怎樣用c語言調(diào)用shell命令
C程序調(diào)用shell腳本共同擁有三種法子 :system()、popen()、exec系列數(shù)call_exec1.c ,
system() 不用你自己去產(chǎn)生進程。它已經(jīng)封裝了,直接增加自己的命令
exec 須要你自己 fork 進程,然后exec 自己的命令
popen() 也能夠?qū)崿F(xiàn)運行你的命令,比system 開銷小
方法一、system()的使用。我直接上代碼吧
int system(const char *command);
我在/home/book/shell新建一個test.sh文件例如以下:
#!bin/bash
echo $HOME
echo “the is test!”
test.c文件例如以下:
#include
int main()
{
system(“bash /home/book/shell/test.sh”); /* chmod +x test.sh ,路徑前面要加上bash */
return 0;
}
運行例如以下命令來編譯:
gcc test.c -o test
測試命令:
./test
結(jié)果例如以下:
/root
the is test!
方法二:popen() 會調(diào)用fork()產(chǎn)生 子歷程,然后從子歷程中調(diào)用/bin/sh -c來履行 參數(shù)command的指令。參數(shù)type可應(yīng)用 “r”代表讀取。“w”代表寫入。遵循此type值。popen()會建立 管道連到子歷程的標(biāo)準(zhǔn) 輸出設(shè)備 或標(biāo)準(zhǔn) 輸入設(shè)備 ,然后返回一個文件指針。
隨后歷程便可利用 此文件指針來讀取子歷程的輸出設(shè)備 或是寫入到子歷程的標(biāo)準(zhǔn) 輸入設(shè)備 中。此外,全部應(yīng)用 文 件指針(FILE*)操作的函數(shù)也都能夠應(yīng)用 ,除了fclose()以外。
返回值:若成功 則返回文件指針,否則返回NULL,差錯 原因存于errno中。注意:在編寫具SUID/SGID權(quán)限的程序時請盡量避免應(yīng)用 popen()。popen()會繼承環(huán)境變量。通過環(huán)境變量可能會造成系統(tǒng)安全的問題
FILE *popen(const char *command, const char *type);
int pclose(FILE *stream);
其它不用改變我們直接改動test.c文件:
#include
int main()
{
char buffer;
FILE *fp=popen(“bash /home/book/shell/test.sh”,”r”);
fgets(buffer,sizeof(buffer),fp);
printf(“%s”,buffer);
pclose(fp);
return 0;
}
方法三:exec函數(shù)簇 (我不太懂,copy別人的。也沒有驗證。習(xí)慣方法一)
須要注意的是exec并非1個函數(shù), 事實上它僅僅是一組函數(shù)的統(tǒng)稱, 它包含以下6個函數(shù):
#include
int execl(const char *path, const char *arg, …);
int execlp(const char *file, const char *arg, …);
int execle(const char *path, const char *arg, …, char *const envp);
int execv(const char *path, char *const argv);
int execvp(const char *file, char *const argv);
int execve(const char *path, char *const argv, char *const envp;
能夠見到這6個函數(shù)名字不同, 并且他們用于接受的參數(shù)也不同.
實際上他們的功能都是幾乎相同的, 由于要用于接受不同的參數(shù)所以要用不同的名字區(qū)分它們, 畢竟c語言沒有函數(shù)重載的功能嘛..
可是實際上它們的命名是有規(guī)律的:
exec
exec函數(shù)里的參數(shù)能夠分成3個部分, 運行文件部分, 命令參數(shù)部分, 環(huán)境變量部分.
比如我要運行1個命令 ls -l /home/gateman
運行文件部分就是 “/usr/bin/ls”
命令參賽部分就是 “l(fā)s”,”-l”,”/home/gateman”,NULL見到是以ls開頭 每1個空格都必須分開成2個部分, 并且以NULL結(jié)尾的啊.
環(huán)境變量部分, 這是1個數(shù)組,最后的元素必須是NULL 比如 char * env = {“PATH=/home/gateman”, “USER=lei”, “STATUS=testing”, NULL};
好了說下命名規(guī)則:
e興許, 參數(shù)必須帶環(huán)境變量部分, 環(huán)境變零部分參數(shù)會成為運行exec函數(shù)期間的環(huán)境變量, 比較少用
l 興許, 命令參數(shù)部分必須以”,” 相隔, 最后1個命令參數(shù)必須是NULL
v 興許, 命令參數(shù)部分必須是1個以NULL結(jié)尾的字符串指針數(shù)組的頭部指針.比如char * pstr就是1個字符串的指針, char * pstr 就是數(shù)組了, 分別指向各個字符串.
關(guān)于Linux命令的介紹,看看《linux就該這么學(xué)》,具體關(guān)于這一章地址3w(dot)linuxprobe/chapter-02(dot)html
p興許, 運行文件部分能夠不帶路徑, exec函數(shù)會在$PATH中找
還有1個注意的是, exec函數(shù)會代替運行它的進程, 也就是說, 一旦exec函數(shù)運行成功, 它就不會返回了, 進程結(jié)束. 可是假設(shè)exec函數(shù)運行失敗, 它會返回失敗的信息, 并且進程繼續(xù)運行后面的代碼!
通常exec會放在fork() 函數(shù)的子進程部分, 來替代子進程運行啦, 運行成功后子程序就會消失, 可是運行失敗的話, 必須用exit()函數(shù)來讓子進程退出!
C程序調(diào)用shell腳本共同擁有三種法子 :system()、popen()、exec系列數(shù)call_exec1.c ,
system() 不用你自己去產(chǎn)生進程。它已經(jīng)封裝了,直接增加自己的命令
exec 須要你自己 fork 進程,然后exec 自己的命令
popen() 也能夠?qū)崿F(xiàn)運行你的命令,比system 開銷小
方法一、system()的使用。我直接上代碼吧
int system(const char *command);
我在/home/book/shell新建一個test.sh文件例如以下:
#!bin/bash
echo $HOME
echo “the is test!”
test.c文件例如以下:
#include
int main()
{
system(“bash /home/book/shell/test.sh”); /* chmod +x test.sh ,路徑前面要加上bash */
return 0;
}
運行例如以下命令來編譯:
gcc test.c -o test
測試命令:
./test
結(jié)果例如以下:
/root
關(guān)于c 實現(xiàn)linux命令行的介紹到此就結(jié)束了,不知道你從中找到你需要的信息了嗎 ?如果你還想了解更多這方面的信息,記得收藏關(guān)注本站。
創(chuàng)新互聯(lián)【028-86922220】值得信賴的成都網(wǎng)站建設(shè)公司。多年持續(xù)為眾多企業(yè)提供成都網(wǎng)站建設(shè),成都品牌建站設(shè)計,成都高端網(wǎng)站制作開發(fā),SEO優(yōu)化排名推廣服務(wù),全網(wǎng)營銷讓企業(yè)網(wǎng)站產(chǎn)生價值。
分享名稱:C語言編寫Linux命令行工具(c實現(xiàn)linux命令行)
文章網(wǎng)址:http://www.dlmjj.cn/article/dpghcgj.html


咨詢
建站咨詢
