Linux中啟動另一個(gè)可執(zhí)行文件或程序用system函數(shù)最理想了,這個(gè)函數(shù)將在你編寫的那個(gè)程序的內(nèi)部啟動另一個(gè)程序,從而創(chuàng)建一個(gè)新進(jìn)程,并等待這個(gè)進(jìn)程執(zhí)行完畢退出。如果正常執(zhí)行,system函數(shù)將返回被執(zhí)行程序的退出碼;如果無法運(yùn)行這個(gè)程序,將返回錯誤代碼127;如果是其他錯誤,返回-1。這個(gè)函數(shù)的原型是:
員工經(jīng)過長期磨合與沉淀,具備了協(xié)作精神,得以通過團(tuán)隊(duì)的力量開發(fā)出優(yōu)質(zhì)的產(chǎn)品。創(chuàng)新互聯(lián)堅(jiān)持“專注、創(chuàng)新、易用”的產(chǎn)品理念,因?yàn)椤皩W⑺詫I(yè)、創(chuàng)新互聯(lián)網(wǎng)站所以易用所以簡單”。公司專注于為企業(yè)提供成都網(wǎng)站建設(shè)、網(wǎng)站制作、微信公眾號開發(fā)、電商網(wǎng)站開發(fā),重慶小程序開發(fā),軟件定制開發(fā)等一站式互聯(lián)網(wǎng)企業(yè)服務(wù)。
#include stdlib.h
int system(const char *string);
參數(shù)string是將要執(zhí)行的程序的命令字符串。
還有一種執(zhí)行外部程序的方法是exec系列函數(shù),但這個(gè)系列的函數(shù)都是將當(dāng)前進(jìn)程的替換成新進(jìn)程,也就是說原來的進(jìn)程不存在了。
我不太明白你說的是什么意思,Linux下的C編程一般是通過gcc實(shí)現(xiàn)的。\x0d\x0a例如,創(chuàng)建了一個(gè)hello.c文本,在文本中寫入\x0d\x0a#include\x0d\x0aintmain(void)\x0d\x0a{\x0d\x0aprintf(“helloworld!!”);\x0d\x0areturn0;\x0d\x0a}\x0d\x0a然后在終端輸入\x0d\x0a$gcc_ohellohello.c\x0d\x0a$/tmp/hello\x0d\x0a注:hello.c文件放在/tmp目錄下,通過gcc-ohellohello.c命令生成一個(gè)hello文件,它是一個(gè)可執(zhí)行文件,然后直接執(zhí)行,就可以運(yùn)行該程序了。
./rm filename和
在你的bash里面輸入rm filename本質(zhì)不是一樣的么
就是把那個(gè)rm的實(shí)現(xiàn)放在你的自己的mini bash里面就可以了啊
調(diào)用
remove(filename);
就行了
1,首先需要了解cp的原理。
2,可以參考cp的源碼去了解其原理
3,cp命令的源碼可以在linux內(nèi)核中找到。
4,或者下載busybox其中也會有cp的源碼
只有了解其原理之后才能談如何實(shí)現(xiàn)。參考代碼如下:
#include?stdio.h
#include?stdlib.h
#include?sys/stat.h
#include?sys/types.h
#include?fcntl.h
#include?errno.h
#include?unistd.h
#include?string.h
#define?BUF_SIZE?1024
#define?PATH_LEN?128
void?my_err(char?*err_string,?int?line?)
{
fprintf(stderr,"line:%d?",line);
perror(err_string);?
exit(1);
}
void?copy_data(const?int?frd,const?int?fwd)
{
int?read_len?=?0,?write_len?=?0;
unsigned?char?buf[BUF_SIZE],?*p_buf;
while?(?(read_len?=?read(frd,buf,BUF_SIZE))?)?{
if?(-1?==?read_len)?{
my_err("Read?error",?__LINE__);
}
else?if?(read_len??0)?{?//把讀取部分寫入目標(biāo)文件
p_buf?=?buf;
while?(?(write_len?=?write(fwd,p_buf,read_len))?)?{
if(write_len?==?read_len)?{
break;
}
else?if?(write_len??0)?{?//只寫入部分
p_buf?+=?write_len;
read_len?-=?write_len;
}
else?if(-1?==?write_len)?{
my_err("Write?error",?__LINE__);
}
}
if?(-1?==?write_len)?break;
}
}
}
int?main(int?argc,?char?**argv)?
{
int?frd,?fwd;?//讀寫文件描述符
int?len?=?0;
char?*pSrc,?*pDes;?//分別指向源文件路徑和目標(biāo)文件路徑
struct?stat?src_st,des_st;
if?(argc??3)?{
printf("用法?./MyCp?源文件路徑?目標(biāo)文件路徑\n");
my_err("arguments?error?",?__LINE__);
}
frd?=?open(argv[1],O_RDONLY);
if?(frd?==?-1)?{
my_err("Can?not?opne?file",?__LINE__);
}
if?(fstat(frd,src_st)?==?-1)?{
my_err("stat?error",__LINE__);
}
/*檢查源文件路徑是否是目錄*/
if?(S_ISDIR(src_st.st_mode))?{
my_err("略過目錄",__LINE__);
}
pDes?=?argv[2];
stat(argv[2],des_st);
if?(S_ISDIR(des_st.st_mode))?{?//目標(biāo)路徑是目錄,則使用源文件的文件名
len?=?strlen(argv[1]);
pSrc?=?argv[1]?+?(len-1);?//指向最后一個(gè)字符
/*先找出源文件的文件名*/
while?(pSrc?=?argv[1]??*pSrc?!=?'/')?{
pSrc--;
}
pSrc++;//指向源文件名
len?=?strlen(argv[2]);?
//?.?表示復(fù)制到當(dāng)前工作目錄
if?(1?==?len??'.'?==?*(argv[2]))?{
len?=?0;?//沒有申請空間,后面就不用釋放
pDes?=?pSrc;
}
else?{?//復(fù)制到某目錄下,使用源文件名
pDes?=?(char?*)malloc(sizeof(char)*PATH_LEN);
if?(NULL?==?pDes)?{
my_err("malloc?error?",?__LINE__);
}
strcpy(pDes,argv[2]);
if?(?*(pDes+(len-1))?!=?'/'?)?{?//目錄缺少最后的'/',則補(bǔ)上’/‘
strcat(pDes,"/");
}
strcat(pDes+len,pSrc);
}
}
/*?打開目標(biāo)文件,?使權(quán)限與源文件相同*/?
fwd?=?open(pDes,O_WRONLY?|?O_CREAT?|?O_TRUNC,src_st.st_mode);
if?(fwd?==?-1)?{
my_err("Can?not?creat?file",?__LINE__);
}
copy_data(frd,fwd);
//puts("end?of?copy");
if?(len??0??pDes?!=?NULL)
free(pDes);
close(frd);
close(fwd);
return?0;
}