wc:标准输入:错误的文件描述符
我试图用管道处理命令,如wc:标准输入:错误的文件描述符,c,pipe,C,Pipe,我试图用管道处理命令,如ls | wc或ls/tmp | wc-l,但我收到了“wc:standard input:Bad file descriptor”消息。这是我第一次做这样的事情。任何建议都会有帮助 #include <stdio.h> #include <string.h> #include <unistd.h> #include <stdlib.h> #include <sys/wait.h> #include <st
ls | wc
或ls/tmp | wc-l
,但我收到了“wc:standard input:Bad file descriptor”消息。这是我第一次做这样的事情。任何建议都会有帮助
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <stdarg.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{
for(;;)
{
char *cmd, *splitcmd, *splinput, *splipip;
int i, j, nargc = 0, characters;
char **cmdArray;
char **splArray;
char **pipArray;
size_t bufsize = 1024;
int *pipefd;
int pipeArrCount;
pid_t pid, wpid;
int status = 0;
int count = 0;
int metro = 0;
char pr1[40], pr2[40], pr0[40];
char pi0[40], pi1[40], pi2[40];
char pip0[40], pip1[40], pip2[40];
int savestdoutfd = dup(fileno(stdout));
int savestdinfd = dup(fileno(stdin));
char *path;
path = getenv("PATH");
cmd = (char *)malloc(bufsize * sizeof(char));
characters = getline(&cmd, &bufsize, stdin);
printf("cmd == => %s characters == => %d \n", cmd, characters);
if (cmd[characters-1] == '\n')
{
cmd[characters-1]='\0';
characters--;
}
printf("cmd == => %s characters == => %d \n", cmd, characters);
cmdArray = (char**)malloc(bufsize * sizeof(char *) );
for (i = 0; i < bufsize; i++ )
{
cmdArray[i]=(char*)malloc(bufsize * sizeof(char ) );
}
splitcmd = strtok(cmd, "|");
printf(" cmd == == %s\n", cmd);
while((splitcmd))
{
strcpy(cmdArray[nargc], splitcmd);
if (cmdArray[nargc][(strlen(cmdArray[nargc]))-1] == ' ')
cmdArray[nargc][(strlen(cmdArray[nargc]))-1]='\0';
printf(" nargc == == %d cmdArray == =[ %s ] \n", nargc, cmdArray[nargc]);
nargc++;
splitcmd = strtok(NULL, "|");
}
strcpy(pr0, cmdArray[0]);
strcpy(pr1, cmdArray[1]);
strcpy(pr2, cmdArray[2]);
printf(" pr0 %s \n", pr0);
printf(" pr1 %s \n", pr1);
printf(" pr2 %s \n", pr2);
splArray = (char**)malloc(bufsize * sizeof(char *) );
for (i = 0; i < bufsize; i++ )
{
splArray[i]=(char*)malloc(bufsize * sizeof(char ) );
}
splinput = strtok(pr0, " ");
while((splinput))
{
strcpy(splArray[count], splinput);
if (splArray[count][(strlen(splArray[count]))-1] == ' ')
splArray[count][(strlen(splArray[count]))-1]='\0';
printf(" count == == %d splArray == =[ %s ] \n", count, splArray[count]);
count++;
splinput = strtok(NULL, " ");
}
strcpy(pi0, splArray[0]);
strcpy(pi1, splArray[1]);
strcpy(pi2, splArray[2]);
printf(" pi0 %s \n", pi0);
printf(" pi1 %s \n", pi1);
printf(" pi2 %s \n", pi2);
pipArray= (char**)malloc(bufsize * sizeof(char *) );
for (i = 0; i < bufsize; i++ )
{
pipArray[i]=(char*)malloc(bufsize * sizeof(char ) );
}
splipip = strtok(pr1, " ");
while((splipip))
{
strcpy(pipArray[metro], splipip);
if (pipArray[metro][(strlen(pipArray[metro]))-1] == ' ')
pipArray[metro][(strlen(pipArray[metro]))-1]='\0';
printf(" metro == == %d pipArray == =[ %s ] \n", metro, pipArray[metro]);
metro++;
splipip = strtok(NULL, " ");
}
strcpy(pip0, pipArray[0]);
strcpy(pip1, pipArray[1]);
strcpy(pip2, pipArray[2]);
printf(" pip0 %s \n", pip0);
printf(" pip1 %s \n", pip1);
printf(" pip2 %s \n", pip2);
pipefd=(int*)malloc(2 * nargc*sizeof(int));
printf(" nargc == = %d\n", nargc);
pipeArrCount = 2*(nargc-1);
printf("pipeArrCount == = %d\n", pipeArrCount);
//exit(0);
for(i = 0; i < pipeArrCount; i)
{
pipe(pipefd + i);
i = i + 2;
}
for(i = 0; i < nargc; i++)
{
if (i == 0)
{
if ((pid = fork()) == 0)
{
dup2(pipefd[2 * i+1], fileno(stdout));
for(j = 0; j < pipeArrCount; j++)
{
close(pipefd[j]);
}
if (count == 1 )
{
char *argv[] = {path, NULL};
execvp(pi0, argv);
for (i = 0; i < 100; i++)
{
free(cmdArray[i]);
}
free(cmdArray);
}
else if (count == 2)
{
char *argv[] = {pi0, pi1, NULL};
execvp(pi0, argv);
for (i = 0; i < 100; i++)
{
free(cmdArray[i]);
}
free(cmdArray);
}
else
{
char *argv[] = {pi0, pi1, pi2, NULL};
execvp(argv[0], argv);
for (i = 0; i < bufsize; i++)
{
free(cmdArray[i]);
}
free(cmdArray);
}
exit(0);
}
wait(&status);
dup2(savestdoutfd, fileno(stdout));
}
else
{
if (fork() == 0)
{
dup2(pipefd[2 * i-1], fileno(stdin));
for(j = 0; j < pipeArrCount; j++)
{
close(pipefd[j]);
}
dup2(savestdoutfd, fileno(stdout));
close(savestdoutfd);
if (metro == 1 )
{
char *argv[] = {pip0, NULL};
execvp(pip0, argv);
for (i = 0; i < 100; i++)
{
free(cmdArray[i]);
}
free(cmdArray);
}
else if (metro == 2)
{
char *argv[] = {pip0, pip1, NULL};
execvp(argv[0], argv);
for (i = 0; i < 100; i++)
{
free(cmdArray[i]);
}
free(cmdArray);
}
else
{
char *argv[] = {pip0, pip1, pip2, NULL};
execvp(argv[0], argv);
for (i = 0; i < 100; i++)
{
free(cmdArray[i]);
}
free(cmdArray);
}
dup2(savestdinfd, fileno(stdin));
close(savestdinfd);
exit(0);
}
}
}
for (j = 0; j < pipeArrCount; j++)
{
close(pipefd[j]);
}
while ((wpid = wait(&status)) > 0);
}
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
int main()
{
对于(;;)
{
char*cmd、*splitcmd、*splinput、*splipp;
int i,j,nargc=0,字符;
字符数组;
字符数组;
字符数组;
尺寸=1024;
int*pipefd;
int-pipeArrCount;
pid_t pid,wpid;
int status=0;
整数计数=0;
int metro=0;
字符pr1[40],pr2[40],pr0[40];
char-pi0[40],pi1[40],pi2[40];
char-pip0[40],pip1[40],pip2[40];
int savestdoutfd=dup(文件号(stdout));
int savestdinfd=dup(文件号(stdin));
字符*路径;
path=getenv(“path”);
cmd=(char*)malloc(bufsize*sizeof(char));
characters=getline(&cmd,&bufsize,stdin);
printf(“cmd==>%s字符===>%d\n”,cmd,字符);
如果(cmd[characters-1]=='\n')
{
cmd[characters-1]='\0';
字符--;
}
printf(“cmd==>%s字符===>%d\n”,cmd,字符);
cmdArray=(char**)malloc(bufsize*sizeof(char*);
对于(i=0;idup2(pipefd[2 * i-1], fileno(stdin));
dup2(pipefd[2*i - 1], fileno(stdin));
dup2(pipefd[2 *(i-1)], fileno(stdin));