所以基本上我想做的事情:
如果我写
你好我在这里
char command[20]
应为' Hello '(该部分有效),而char *parameters
应该有指向' Hello ''我''上午''此处'' NULL '。
对于' Hello '部分,我刚使用char *com
已经是指针。但我真的不知道如何让其余的正确。
基本上:execvp
想要一个带有命令的char
和一个指向命令和所有参数的指针数组(我希望那部分是正确的)。
我不知道如何填写*parameters
。
我担心答案非常明显:(
提前致谢
void read_command(char *com, char **par)
{
string Eingabe = " ";
fprintf(stdout, "$ ");
getline (cin, Eingabe);
strcpy(com, Eingabe.substr(0, Eingabe.find(" ")).c_str());
*par = com;
Eingabe.erase(0, Eingabe.find(" ")+1);
do
{
par++;
strcpy( ???, Eingabe.substr(0, Eingabe.find(" ")).c_str());
Eingabe.erase(0, Eingabe.find(" ")+1);
}while();
return;
}
int main()
{
int childPid;
int status;
char command[20];
char *parameters[60];
while(1)
{
read_command(command, parameters);
if((childPid = fork()) == -1)
{
fprintf(stderr, "can't fork\n");
exit(1);
}else if(childPid == 0)
{
execvp(command, parameters);
exit(0);
}else
{
waitpid(childPid, &status, WUNTRACED | WCONTINUED);
}
}
}
答案 0 :(得分:0)
基本的零拷贝C风格实现可能如下所示:
#include <string.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>
int main()
{
char command[20];
char *parameters[60];
int i, childPid, status;
while(1) {
memset(command, 0, sizeof(command));
memset(parameters, 0, sizeof(parameters));
i = 0;
gets(command);
parameters[i] = strtok(command, " ");
i++;
while(parameters[i] = strtok(NULL, " ")) {
//turn the space before us into a null terminator
*(parameters[i] - 1) = '\0';
i++;
}
if(childPid = fork()) { //assume success, we're the parent
waitpid(childPid, &status, WUNTRACED | WCONTINUED);
}
else { //we're the child
execvp(command, parameters);
exit(0);
}
}
return 0;
}
您正在使用strtok逐步执行命令字符串,随时保存每个参数的位置。 和你正在修改命令字符串以使用空终止符替换''分隔符,随时切断输入字符串。