linux Cでshellコマンドを呼び出し、shellスクリプトを実行します(
2183 ワード
1、system(shellコマンド実行)
相関関数fork,execve,waitpid,popenヘッダファイル#include定義関数int system(const char*string);関数説明system()はfork()を呼び出してサブプロセスを生成し、サブプロセスによって/bin/sh-cstringを呼び出してパラメータstring文字列に代表されるコマンドを実行し、このコマンドが実行されると元の呼び出しのプロセスに戻ります.システム()の呼び出し中にSIGCHLD信号は一時的に保留され、SIGINT信号とSIGQUIT信号は無視されます.戻り値system()が/bin/shの呼び出しに失敗した場合は127、その他の失敗原因は-1を返します.パラメータstringが空のポインタ(NULL)の場合、ゼロ以外の値が返されます.system()呼び出しが成功すると、shellコマンドを実行した後の戻り値が最後に返されますが、この戻り値はsystem()呼び出し/bin/sh失敗で返された127である可能性もありますので、errnoを再確認して実行成功を確認することが望ましいです.追加の説明SUID/SGID権限を持つプログラムを作成するときはシステム()を使用しないでください.システム()は環境変数を継承し、環境変数によってシステムの安全上の問題を引き起こす可能性があります.
例:
#include
main()
{
system(“ls -al/etc/passwd/etc/shadow”);
}
2、popen(配管I/Oの確立)
相関関数pipe,mkfifo,pclose,fork,system,fopenヘッダファイル#include定義関数FILE*popen(const char*command,const char*type);関数はpopen()がfork()を呼び出してサブプロセスを生成し、サブプロセスから/bin/sh-cを呼び出してパラメータcommandの命令を実行することを示します.パラメータtypeは、「r」を使用して読み取りを表し、「w」を使用して書き込みを表す.このtype値に従ってpopen()は、サブプロセスにパイプを接続する標準出力デバイスまたは標準入力デバイスを確立し、ファイルポインタを返します.その後、プロセスは、このファイルポインタを使用して、サブプロセスの出力デバイスを読み取るか、サブプロセスの標準入力デバイスに書き込むことができます.また、fclose()以外のファイルポインタ(FILE*)操作を使用するすべての関数も使用できます.戻り値が正常であればファイルポインタを返し、そうでなければNULLを返し、エラーの原因はerrnoに保存されます.エラーコードEINVALパラメータtypeが不正です.注意事項SUID/SGID権限を持つプログラムを作成する場合は、popen()を使用しないようにしてください.popen()は環境変数を継承し、環境変数によってシステムの安全上の問題を引き起こす可能性があります.
例:
実行root:x:0:root:/root:/bin/bash
3、vfork()を使用してサブプロセスを新規作成し、exec関数ファミリーを呼び出す
#include
main()
{
char * argv[ ]={“ls”,”-al”,”/etc/passwd”,(char*) };
if(vfork() = =0)
{
execv(“/bin/ls”,argv);
}else{
printf(“This is the parent process”);
}
}
相関関数fork,execve,waitpid,popenヘッダファイル#include
例:
#include
main()
{
system(“ls -al/etc/passwd/etc/shadow”);
}
2、popen(配管I/Oの確立)
相関関数pipe,mkfifo,pclose,fork,system,fopenヘッダファイル#include
例:
#include<stdio.h>
main()
{
FILE * fp;
char
buffer[80];
fp=popen(“cat /etc/passwd”,”r”);
fgets(buffer,
sizeof
(buffer),fp);
printf(“%s”,buffer);
pclose(fp);
}
実行root:x:0:root:/root:/bin/bash
3、vfork()を使用してサブプロセスを新規作成し、exec関数ファミリーを呼び出す
#include
main()
{
char * argv[ ]={“ls”,”-al”,”/etc/passwd”,(char*) };
if(vfork() = =0)
{
execv(“/bin/ls”,argv);
}else{
printf(“This is the parent process”);
}
}