導航:首頁 > 程序命令 > c連接linux命令

c連接linux命令

發布時間:2022-08-20 11:45:10

1. 如何在C語言編程中調用linux系統終端下的命令

根據調用需求,可以分為兩種:

一、僅執行系統命令,不需要該命令的列印結果。

這種情況可以用system函數。形式為

system(cmd);

其中cmd為char*類型的字元串,包含要執行的命令,命令的執行結果會輸出到標准輸出。

比如

system("mkdirtest");

這個執行,會在當前文件夾下創建test文件夾。

二、需要命令執行的列印。

雖然同樣可以使用system並重定向到文件,然後打開文件讀取,最終刪除文件。但這樣做比較繁瑣,更好的做法是使用popen。

FILE *fp = popen(cmd);

執行cmd中的命令,然後可以以C文件操作方式,讀取命令的輸出結果。比如:

if((fp=popen("pwd","r"))==NULL)//執行獲取當前目錄的系統命令pwd。
{
printf("執行失敗 ");//fp為NULL表示命令執行失敗。
}
else
{
chars[100];
while(fgets(s,100,fp))//獲取文件內容。
printf("%s",s);//輸出結果。
pclose(fp);//關閉。
}

2. 通過幾個簡單的Linux命令,深入理解c語言編

主要使用gcc命令以及以下幾個參數:

-E Preprocess only; do not compile, assemble or link
-S Compile only; do not assemble or link
-c Compile and assemble, but do not link
-o <file> Place the output into <file>

環境配置好以後,讓我們開始c語言的編譯之旅吧~

編寫c語言源代碼
很多linux命令都可以新建一個文件,比如

$ touch test.c

建立一個空白的文件

$ vim test.c

使用vim(文本編輯器)編輯test.c,如果test.c不存在,則創建

$ echo "123" > test.c

通過輸出重定向新建一個文件

創建完test.c後,將下面這段Hello World代碼寫到test.c中(很多方法)

#include <stdio.h>
int main(){
printf("Hello world\n");
return 0;
}

寫完之後可以使用ls命令來查看當前目錄下的文件,檢查test.c是否存在

$ ls

使用cat命令查看test.c中的內容,檢查是否寫入成功

$ cat test.c

ls-cat

展開頭文件(預處理)
$ gcc -E test.c -o test_pre.c

這個命令把源代碼test.c中的頭文件展開,並把結果輸出到test_pre.c

(可以使用cat或者vim命令查看test_pre.c文件中的內容)
per
test_pre.c中的內容是這樣的,可以發現原本幾行的代碼變成了幾百行,而且已經見不到include關鍵字了,取而代之的是一些變數定義的代碼,這些代碼就是stdio.h中的內容,和stdio.h中頭文件展開後的內容。

編譯
$ gcc -S test_pre.c -o test_asm.s

這一條命令將上一步預處理過後的源代碼編譯成為匯編代碼

asm
現在看到的是test_asm.s裡面的匯編代碼。

什麼是匯編?

匯編語言是匯編指令集、偽指令集和使用它們規則的統稱,使用具有一定含義的符號為助憶符,用指令助憶符、符號地址等組成的符號指令稱為匯編格式指令。

簡單的可以理解為匯編語言是一本詞典,01100101011010這樣的二進制字元串是單詞,匯編指令是單詞的含義。計算機能讀懂二進制字元串,而人能讀懂的是翻譯過來的匯編指令。

匯編
$ gcc -c test_asm.s -o test_obj.o

這一步將test_asm.s匯編成為目標文件,目標文件中存儲的就是010101010這樣的字元串了,可以用cat命令試試去讀取test_obj.o

obj

可以發現列印出來許多不可見的字元,原因是目標文件已經是二進制格式的了,不同於源代碼(文本格式)

有關文件的格式可以看下這里的介紹:
http://www.cnblogs.com/zhangjiankun/archive/2011/11/27/2265184.html

鏈接
鏈接器負責將程序的目標文件與所需的所有附加的目標文件連接起來,最終生成可執行文件。附加的目標文件包括靜態連接庫和動態連接庫。

這個例子中沒有附加的目標文件,所以只需要目標文件做被鏈接的對象。

有關鏈接器的詳細講解大家可以看下這里:
https://www.hu.com/question/27386057

$ gcc test_obj.o -o hello

gcc本身可以充當鏈接器,這里使用gcc命令將目標文件test_obj.o鏈接成了可執行文件hello

ld

運行程序!
至此,源代碼已經經歷了預處理、編譯、匯編、鏈接四步成為了可執行文件,現在試著運行一下這個程序吧

$ ./hello

hello

小結
首先我們創建了源文件test.c,然後用gcc -E將源文件中的頭文件展開,這一步叫做預處理;
之後通過gcc -S將預處理後的源文件編譯了匯編代碼,這一步叫做編譯;
接著使用gcc -c命令將匯編代碼轉換成了二進制的目標文件,這一步操作叫做匯編;
目標文件不同於源代碼,是二進制格式,是源文件編譯過程中產生的中間文件,通過鏈接器可以將多個目標文件鏈接成為可執行文件,這一步叫做鏈接。

源文件->(預處理->編譯->匯編->鏈接)->可執行文件

一般大家所說的c語言編譯,其實是上述這四步的簡稱。

3. 在linux環境下對c語言程序編譯連接後執行該程序為什麼在命令行中加./

./指的是當前目錄,比如當前目錄下有一個可執行文件setup,那麼你需要用命令./setup來執行這個文件。如果直接用setup是不行的。為了區分可執行文件的名字和系統命令,需要這樣的設定。
例如,你的可執行文件名為exit,那麼你直接輸入exit,系統是要退出呢?還是執行exit這個文件呢?系統會退出!這就是一個矛盾,而你輸入./exit,那麼系統就能夠執行exit這個文件了。
希望對你有所幫助。

4. 怎麼在 c 代碼里 加入 linux 命令啊

system(const char*);

exec()等函數

5. 簡述linux系統中,一個C語言的源程序從編輯,編譯,連接一直到運行的步驟每一步用到的命令

編輯:linux下編輯器一大堆,隨便那個編輯器都可以,比如我用的是vim,
vim first.c 在裡面就可以編輯了
編譯:我用的是gcc

vim first.c #edit
gcc -o first first.c #compile
./first #run

6. 如何在objective-c中調用linux命令

可以 直接執行命令

voidrunls()
{
[[:@"/bin/ls"
arguments:[NSArrayarray]]waitUntilExit];
}

或者 啟動sh執行命令。

voidrunSystemCommand(NSString*cmd)
{
[[:@"/bin/sh"
arguments:[NSArrayarrayWithObjects:@"-c",cmd,nil]]
waitUntilExit];

7. linux下怎樣用c語言調用shell命令

C程序調用shell腳本共同擁有三種法子 :system()、popen()、exec系列數call_exec1.c ,
system() 不用你自己去產生進程。它已經封裝了,直接增加自己的命令
exec 須要你自己 fork 進程,然後exec 自己的命令

popen() 也能夠實現運行你的命令,比system 開銷小

方法一、system()的使用。我直接上代碼吧

int system(const char *command);

我在/home/book/shell新建一個test.sh文件例如以下:

<span style="font-size:18px;"><span style="font-size:18px;">#!bin/bash
echo $HOME
echo "the is test!"</span></span>

test.c文件例如以下:

<span style="font-size:18px;"><span style="font-size:18px;">#include<stdlib.h>

int main()
{
system("bash /home/book/shell/test.sh"); /* chmod +x test.sh ,路徑前面要加上bash */
return 0;
}</span></span>

運行例如以下命令來編譯:
<span style="font-size:18px;">gcc test.c -o test
</span>

測試命令:

<span style="font-size:18px;">./test</span>

結果例如以下:

<span style="font-size:18px;">/root
the is test!</span>

方法二:popen() 會調用fork()產生 子歷程,然後從子歷程中調用/bin/sh -c來履行 參數command的指令。參數type可應用 「r」代表讀取。「w」代表寫入。遵循此type值。popen()會建立 管道連到子歷程的標准 輸出設備 或標准 輸入設備 ,然後返回一個文件指針。
隨後歷程便可利用 此文件指針來讀取子歷程的輸出設備 或是寫入到子歷程的標准 輸入設備 中。此外,全部應用 文 件指針(FILE*)操作的函數也都能夠應用 ,除了fclose()以外。

返回值:若成功 則返迴文件指針,否則返回NULL,差錯 原因存於errno中。注意:在編寫具SUID/SGID許可權的程序時請盡量避免應用 popen()。popen()會繼承環境變數。通過環境變數可能會造成系統安全的問題

FILE *popen(const char *command, const char *type);
int pclose(FILE *stream);

其它不用改變我們直接改動test.c文件:

#include<stdio.h>
int main()
{
char buffer[80];
FILE *fp=popen("bash /home/book/shell/test.sh","r");
fgets(buffer,sizeof(buffer),fp);
printf("%s",buffer);
pclose(fp);
return 0;
}

方法三:exec函數簇 (我不太懂,別人的。也沒有驗證。習慣方法一)
須要注意的是exec並非1個函數, 事實上它僅僅是一組函數的統稱, 它包含以下6個函數:

#include <unistd.h>

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個函數名字不同, 並且他們用於接受的參數也不同.
實際上他們的功能都是幾乎相同的, 由於要用於接受不同的參數所以要用不同的名字區分它們, 畢竟c語言沒有函數重載的功能嘛..

可是實際上它們的命名是有規律的:
exec[l or v][p][e]

exec函數里的參數能夠分成3個部分, 運行文件部分, 命令參數部分, 環境變數部分.
比如我要運行1個命令 ls -l /home/gateman

運行文件部分就是 "/usr/bin/ls"
命令參賽部分就是 "ls","-l","/home/gateman",NULL 見到是以ls開頭 每1個空格都必須分開成2個部分, 並且以NULL結尾的啊.
環境變數部分, 這是1個數組,最後的元素必須是NULL 比如 char * env[] = {"PATH=/home/gateman", "USER=lei", "STATUS=testing", NULL};

好了說下命名規則:
e興許, 參數必須帶環境變數部分, 環境變零部分參數會成為運行exec函數期間的環境變數, 比較少用
l 興許, 命令參數部分必須以"," 相隔, 最後1個命令參數必須是NULL
v 興許, 命令參數部分必須是1個以NULL結尾的字元串指針數組的頭部指針. 比如char * pstr就是1個字元串的指針, char * pstr[] 就是數組了, 分別指向各個字元串.

關於Linux命令的介紹,看看《linux就該這么學》,具體關於這一章地址3w(dot)linuxprobe/chapter-02(dot)html

p興許, 運行文件部分能夠不帶路徑, exec函數會在$PATH中找

還有1個注意的是, exec函數會代替運行它的進程, 也就是說, 一旦exec函數運行成功, 它就不會返回了, 進程結束. 可是假設exec函數運行失敗, 它會返回失敗的信息, 並且進程繼續運行後面的代碼!

通常exec會放在fork() 函數的子進程部分, 來替代子進程運行啦, 運行成功後子程序就會消失, 可是運行失敗的話, 必須用exit()函數來讓子進程退出!

8. 如何在linux下的C里調用系統命令,等同輸入命令

system(執行shell 命令) 相關函數 fork,execve,waitpid,popen 表頭文件 #include 定義函數 int system(const char * string); 函數說明 system()會調用fork()產生子進程,由子進程來調用/bin/sh-c string來執行參數string字元串所代表的命令,此命令執行完後隨即返回原調用的進程。在調用system()期間SIGCHLD 信號會被暫時擱置,SIGINT和SIGQUIT 信號則會被忽略。 返回值 如果system()在調用/bin/sh時失敗則返回127,其他失敗原因返回-1。若參數string為空指針(NULL),則返回非零值。如果system()調用成功則最後會返回執行shell命令後的返回值,但是此返回值也有可能為system()調用/bin/sh失敗所返回的127,因此最好能再檢查errno 來確認執行成功。 附加說明 在編寫具有SUID/SGID許可權的程序時請勿使用system(),system()會繼承環境變數,通過環境變數可能會造成系統安全的問題。 範例 #includemain(){system(「ls -al /etc/passwd /etc/shadow」);} 執行 -rw-r--r-- 1 root root 705 Sep 3 13 :52 /etc/passwd-r--------- 1 root root 572 Sep 2 15 :34 /etc/shadow如何在linux下的C里調用系統命令,等同輸入命令

9. 在Linux系統中,如何運行一個C語言程序

1、打開kali linux的終端。創建一個文件並命名為test.c。在終端輸入:touch test.c。

閱讀全文

與c連接linux命令相關的資料

熱點內容
win10截圖編程 瀏覽:418
怎樣把名字變成文件夾 瀏覽:199
文件怎麼搞成文件夾 瀏覽:726
多線程編程php 瀏覽:602
安卓機越用越卡有什麼辦法 瀏覽:7
高中生解壓操場適合做的游戲 瀏覽:391
程序員java招聘 瀏覽:446
未來之光手機雲伺服器 瀏覽:158
伺服器下載資料為什麼c盤滿了 瀏覽:263
怎麼清除空文件夾 瀏覽:544
如何查看派派伺服器 瀏覽:802
殺手6解壓畫面 瀏覽:669
誇張程序員 瀏覽:467
如何直播切兩個APP畫面 瀏覽:784
4x4測試伺服器怎麼獲得 瀏覽:740
開環與閉環python 瀏覽:517
蘋果手機上的東西怎麼加密 瀏覽:554
坐過牢可以做程序員嗎 瀏覽:254
男友是程序員女友是自由職業 瀏覽:272
娃娃智慧閱讀源碼 瀏覽:163