基本上我想做的是:
如果我写
Hello I am here
char command[20]
应该是 'Hello'(那部分有效)并且 char *parameters
应该有指向 ' 你好' '我' '我' '这里' '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);
}
}
}
最佳答案
基本的零拷贝 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 单步执行命令字符串,并在执行过程中保存每个参数的位置。 并且您正在就地修改命令字符串以将“”定界符替换为空终止符,同时将输入字符串切碎。
关于c++ - unix minishell char 转换成 **char,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36743559/