gpt4 book ai didi

c - 如何处理 ls | C 中的 "pipe"命令

转载 作者:太空宇宙 更新时间:2023-11-04 02:57:11 28 4
gpt4 key购买 nike

我有一个用 C 编写的 shell 程序,当我尝试运行命令“ls |”时(只有 ls 和一个没有任何内容的管道),我的程序永远循环。您可以忽略 modePtr... 这个解析器所做的是从用户输入中获取一串字符,因此它正在解析命令“ls |”我猜这个问题是因为没有一个空管道命令会陷入的“案例”,导致无限循环?有什么建议吗?

int parse(char *inputString, char *cmdArgv[], char **supplementPtr, int *modePtr)
{
int cmdArgc = 0, terminate = 0;
char *srcPtr = inputString;
//printf("parse fun%sends", inputString);
while(*srcPtr != '\0' && terminate == 0)
{
*cmdArgv = srcPtr;
cmdArgc++;
//printf("parse fun2%sends", *cmdArgv);
while(*srcPtr != ' ' && *srcPtr != '\t' && *srcPtr != '\0' && *srcPtr != '\n' && terminate == 0)
{
// Handles redirection/pipes
switch(*srcPtr)
{
// Background mode
case '&':
*modePtr = BACKGROUND;
break;
// Output mode
case '>':
*modePtr = OUTPUT_REDIRECTION;
*cmdArgv = '\0';
srcPtr++;
if(*srcPtr == '>')
{
*modePtr = OUTPUT_APP;
srcPtr++;
}
while(*srcPtr == ' ' || *srcPtr == '\t' || *srcPtr == '\0')
srcPtr++;
*supplementPtr = srcPtr;
chop(*supplementPtr);
terminate = 1;
break;
// Input mode
case '<':
*modePtr = INPUT_REDIRECTION;
*cmdArgv = '\0';
srcPtr++;
while(*srcPtr == ' ' || *srcPtr == '\t' || *srcPtr == '\0')
srcPtr++;
*supplementPtr = srcPtr;
chop(*supplementPtr);
terminate = 1;
break;
// Pipe mode
case '|':
*modePtr = PIPELINE;
*cmdArgv = '\0';
srcPtr++;
while(*srcPtr == ' ' || *srcPtr == '\t' || *srcPtr == '\0')
srcPtr++;
*supplementPtr = srcPtr;
//chop(*supplementPtr);
terminate = 1;
break;
}
srcPtr++;
}
// Process commands when these occur
while((*srcPtr == ' ' || *srcPtr == '\t' || *srcPtr == '\n') && terminate == 0)
{
*srcPtr = '\0';
srcPtr++;
}
cmdArgv++;
}
/*srcPtr++;
*srcPtr = '\0';
destPtr--;*/
*cmdArgv = '\0';
return cmdArgc;
}

最佳答案

您可能把问题复杂化了。如果您希望程序读取通过管道传输给它的列表项...

#define MAXLINELEN 1000
#include <stdio.h>
#include <stdlib.h>

int main (int argc, char *argv[]) {

char line[MAXLINELEN];
FILE *fpin;

fpin=stdin;

while(fgets(line,MAXLINELEN,fpin)!=NULL) printf("%s",line);

}

...然后您可以使用 strtok() 解析每一行的项目,或者如果您使用“ls -1”,则每个列表项目无论如何都在一个唯一的行上。

希望这对您有所帮助。

关于c - 如何处理 ls | C 中的 "pipe"命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16062660/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com