『壹』 關於c++調用shell命令的問題
在C語言中調用shell命令的方法實現。
C程序調用shell腳本共有兩種方法 :system()、popen(),分別如下:
system()
不用自己去創建進程,系統已經封裝了這一步,直接加入自己的命令即可
popen() 也可以實現執行的命令,比system
開銷小
以下分別說明:
1)system(shell命令或shell腳本路徑);
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 來確認履行 成功 。
system命令以其簡略
高效的作用得到很很廣泛 的利用 ,下面是一個例子
例:在/tmp/testDir/目錄下有shell腳本tsh.sh,內容為
#!/bin/sh
wget $1
echo "Done!"
2)popen(char
*command,char *type)
popen()
會調用fork()產生 子歷程,然後從子歷程中調用/bin/sh -c來履行 參數command的指令。參數type可應用
「r」代表讀取,「w」代表寫入。遵循此type值,popen()會建立 管道連到子歷程的標准 輸出設備 或標准 輸入設備
,然後返回一個文件指針。隨後歷程便可利用 此文件指針來讀取子歷程的輸出設備 或是寫入到子歷程的標准 輸入設備 中。此外,所有應用 文
件指針(FILE*)操作的函數也都可以應用 ,除了fclose()以外。
返回值:若成功
則返迴文件指針,否則返回NULL,差錯 原因存於errno中。注意:在編寫具SUID/SGID許可權的程序時請盡量避免應用
popen(),popen()會繼承環境變數,通過環境變數可能會造成系統安全的問題。
例:C程序popentest.c內容如下:
#include
main
{
FILE * fp;
charbuffer[80];
fp=popen(「~/myprogram/test.sh」,」r」);
fgets(buffer,sizeof(buffer),fp);
printf(「%s」,buffer);
pclose(fp);
}
『貳』 如何在C語言中執行shell命令
可以通過system函數,調用shell命令。
1 函數原型:
int system(const char *cmd);
2 功能:
調用cmd內容的系統命令,即shell命令。
3 頭文件:
stdlib.h
4 舉例:
system("ls");
列印當前工作目錄下的文件。
『叄』 c語言如何調用需傳入參數的shell腳本
#include<stdio.h>
intmain(intargc,char**argv)
{
inti;
for(i=0;i<argc;i++)
printf("%s ",argv[i]);
return0;
}
比方這個程序叫 main.c 吧,先編譯成 main.exe
gcc main.c -o main.exe
然後用命令運行
main.exe aefae 2423 asdae
程序輸出:
main.exe
aefae
2423
asdae
argv 是通過命令行傳送給程序的參數的字元串指針數組,argc 是參數的個數
#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
intmain(intargc,charconst*argv[])
{
pid_tpid;
while(1){
printf(" 0---killthework ");
printf("1---usels/ ");
intchoose=0;
scanf("%d",&choose);
switch(choose)
{
case1:
//把當前進程復制一份來創建一個新進程
pid=fork();
//如果pid==0,說明是新創建的進程
if(pid==0)
{
close(0);
//用下面的命令替換近程的執行內容
execlp("ls","ls","/",NULL);
exit(0);
}
break;
case0:
if(pid!=0)
kill(pid,9);
return-1;
default:
printf("NO ");
}
}
return0;
}
『伍』 Linux C編程,如何將自己的shell執行時可以帶一個命令選項或參數命令行
把 main() 改寫成:
main(int argc,char *argv[])
其中,argc 是參數的個數+1,argv[0] 是命令名本身,argv[1] ...... argv[argc-1] 是命令後帶的各個參數構成的字元串。 你使用自編程序作為命令時,在命令名後跟的多參數是以空格分割的,如果某個參數本身就帶空格,必須用引號把它引起來。
在程序中訪問 argv[1] ...... argv[argc-1] 就可以訪問到你下命令時輸入的各個參數。
『陸』 如何在C語言中調用shell命令
在linux操作系統中,很多shell命令使用起來非常簡單,這些shell命令的程序實現已經被底層實現好。有時候需要在程序中調用shell命令,這樣可以就不用在控制台上手動輸入shell命令了,下面就以三個函數為例來講解如何在C語言中調用shell命令。
1、system(執行shell 命令)
相關函數 fork,execve,waitpid,popen
表頭文件 #include<stdlib.h>
定義函數 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()會
繼承環境變數,通過環境變數可能會造成系統安全的問題。
範例:
#include<stdlib.h>
main()
{
system(「ls -al /etc/passwd /etc/shadow」);
}
2、popen(建立管道I/O)
相關函數 pipe,mkfifo,pclose,fork,system,fopen
表頭文件 #include<stdio.h>
定義函數 FILE * popen( const char * command,const char * type);
函數說明 popen()會調用fork()產生子進程,然後從子進程中調用/bin/sh -c
來執行參數command的指令。參數type可使用「r」代表讀取,「w」
代表寫入。
『柒』 怎麼在c語言程序里調用shell腳本文件
intiRetCode;
charsStr[100];
sprintf(sStr,"home/test/upload/unload.sh");
iRetCode=system(sStr);
if(iRetCode<0)
{
printf("shellerror!");
}
『捌』 linux下如何用c語言調用shell命令
在c語言中調用shell命令的方法實現。
c程序調用shell腳本共有兩種方法
:system()、popen(),分別如下:
system()
不用自己去創建進程,系統已經封裝了這一步,直接加入自己的命令即可
popen()
也可以實現執行的命令,比system
開銷小
以下分別說明:
1)system(shell命令或shell腳本路徑);
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
來確認履行
成功
。
system命令以其簡略
高效的作用得到很很廣泛
的利用
,下面是一個例子
例:在/tmp/testdir/目錄下有shell腳本tsh.sh,內容為
#!/bin/sh
wget
$1
echo
"done!"
2)popen(char
*command,char
*type)
popen()
會調用fork()產生
子歷程,然後從子歷程中調用/bin/sh
-c來履行
參數command的指令。參數type可應用
「r」代表讀取,「w」代表寫入。遵循此type值,popen()會建立
管道連到子歷程的標准
輸出設備
或標准
輸入設備
,然後返回一個文件指針。隨後歷程便可利用
此文件指針來讀取子歷程的輸出設備
或是寫入到子歷程的標准
輸入設備
中。此外,所有應用
文
件指針(file*)操作的函數也都可以應用
,除了fclose()以外。
返回值:若成功
則返迴文件指針,否則返回null,差錯
原因存於errno中。注意:在編寫具suid/sgid許可權的程序時請盡量避免應用
popen(),popen()會繼承環境變數,通過環境變數可能會造成系統安全的問題。
例:c程序popentest.c內容如下:
#include
main
{
file
*
fp;
charbuffer[80];
fp=popen(「~/myprogram/test.sh」,」r」);
fgets(buffer,sizeof(buffer),fp);
printf(「%s」,buffer);
pclose(fp);
}