通过C程序运行Shell命令,使用execlp函数
execlp的几个参数分别为:文件名,各个参数,(char*)0
其中“各个参数”部分中的第一个参数就是文件名(相当于文件名要输入两遍)
最后一个参数写(char*)0就可以了
文件b.cpp代码:
循环地输入命令→执行命令,直到按下Ctrl+C结束
#include
#include
#include
#include
using namespace std;
#define MAX_PARA_NUMS 10
#define MAX_CHAR_EACH_PARA 1000
int split(char* input, char output[MAX_PARA_NUMS][MAX_CHAR_EACH_PARA])
{
int counter = 0;
int len = strlen(input);
bool bTemp = false;
int i, j = 0;
for(i = 0; i < len; i++)
{
if(input[i] == ' ')
{
if(j != 0 && counter > 0)
{
output[counter - 1][j] = '\0';
}
bTemp = false;
}
else
{
if(bTemp == false)
{
j = 0;
counter++;
bTemp = true;
}
output[counter - 1][j] = input[i];
j++;
}
}
return counter;
}
int main()
{
int counter = 0;
char params[MAX_PARA_NUMS][MAX_CHAR_EACH_PARA];
//使用g++编译文件
//execlp("g++", "g++", "a.cpp", "-o", "a", (char*)0);
char buf[4096];
pid_t pid;
int status;
//输入PROMPT字符串
printf("CONSOLE-X\n");
printf("=========\n");
while (fgets(buf, 4096, stdin) != NULL)
{
if (buf[strlen(buf) - 1] == '\n')
{
buf[strlen(buf) - 1] = '\0';
}
pid = fork();
if (pid < 0)
{
printf("fork error");
}
else if (pid == 0)
{
counter = split(buf, params);
if(counter != 0)
{
printf("---------\n");
}
switch(counter)
{
case 0: break;
case 1:
{
execlp(params[0], params[0], (char*)0);
}
break;
case 2:
{
execlp(params[0], params[0], params[1], (char*)0);
}
break;
case 3:
{
execlp(params[0], params[0], params[1], params[2],
(char*)0);
}
break;
case 4:
{
execlp(params[0], params[0], params[1], params[2],
params[3], (char*)0);
}
break;
case 5:
{
execlp(params[0], params[0], params[1], params[2],
params[3], params[4], (char*)0);
}
break;
case 6:
{
execlp(params[0], params[0], params[1], params[2],
params[3], params[4], params[5], (char*)0);
}
break;
case 7:
{
execlp(params[0], params[0], params[1], params[2],
params[3], params[4], params[5], params[6], (char*)0);
}
break;
case 8:
{
execlp(params[0], params[0], params[1], params[2],
params[3], params[4], params[5], params[6],
params[7], (char*)0);
}
break;
case 9:
{
execlp(params[0], params[0], params[1], params[2],
params[3], params[4], params[5], params[6],
params[7], params[8], (char*)0);
}
break;
case 10:
{
execlp(params[0], params[0], params[1], params[2],
params[3], params[4], params[5], params[6],
params[7], params[8], params[9], (char*)0);
}
break;
default:
{
printf("Illegal Input!\n");
}
break;
}
}
else
{
//输入PROMPT字符串
//printf("CONSOLE-X> ");
}
}
return 0;
}
将b.cpp编译成可执行的文件b(输入命令:g++ b.cpp -o b)
然后打开文件b,依次输入命令
ls -ls
cat a.cpp
g++ a.cpp -o a
./a
文件a.cpp代码:
#include
using namespace std;
int main()
{
cout << "Hello World!" << endl;
return 0;
}
运行结果示例:
END