我正在为我的项目实现管道功能。到目前为止,当我将常量数组固定到execlp()并在我的管道函数中执行它时,它工作正常。但是当我尝试使用用户输入并将其拆分时,我总是得到"无效的尾随选项,试试 - 更多信息"。它不仅仅是使用head命令。 ""是用户从getline()输入的字符串。
int fd[2];
char *d[2];
d[0] = strtok(a, "|"); // array for the different tokens in the command
d[1] = strtok(NULL, "|");
pid_t cpid;
pipe(pfd);
cpid = fork();
if(cpid == 0){
/* child */
dup2(pfd[1], 1);
close(pfd[0]);
close(pfd[1]); /* the child does not need this end of the pipe */
execString(d[0]);
//perror(cmd2[0]);
cout << "error";
} else{
cpid = fork();
if(cpid == 0){
/* parent */
dup2(pfd[0], 0);
close(pfd[0]);
close(pfd[1]); /* the parent does not need this end of the pipe */
execString(d[1]);
//perror(cmd1[0]);
cout << "error";
} else{
int status;
close(pfd[0]);
close(pfd[1]);
waitpid(cpid, &status, 0);
perror("fork");
exit(1);
}
}
当我运行诸如man date之类的命令时,这是我为execvp()执行字符数组而创建的方法。 grep os,它会显示日期手册,但grep OS会失败。所以字符串函数只能工作一半?这真让我困扰。有什么想法吗?
void execString(char *b){
enum { MAX_ARGS = 64 };
char *args[MAX_ARGS];
char **next = args;
char *temp = strtok(b, " ");
while (temp != NULL)
{
*next++ = temp;
//printf("%s\n", temp);
temp = strtok(NULL, " ");
}
*next = NULL;
execvp(args[0], args);
}