gpt4 book ai didi

c - 编写我自己的 shell,未声明的标识符 "output"

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:04:16 26 4
gpt4 key购买 nike

这是我的代码,用于我自己的 C shell。编译时出现错误:使用未声明的标识符“输出”。以下是编译时的一些错误示例:

error: use of undeclared identifier 'output' char input[100];output[100];

test3.c:53:15: error: use of undeclared identifier 'output' strcpy(output,args[i+1]); ^

test3.c:53:15: error: use of undeclared identifier 'output'

test3.c:60:8: warning: implicit declaration of function 'open' is invalid in C99 [-Wimplicit-function-declaration] j = open(input, O_RDONLY, 0); ^

test3.c:60:20: error: use of undeclared identifier 'O_RDONLY' j = open(input, O_RDONLY, 0); ^

test3.c:61:29: error: use of undeclared identifier 'O_RDONLY' if ((j = open(input, O_RDONLY, 0)) < 0) {

test3.c:70:12: warning: implicit declaration of function 'creat' is invalid in C99 [-Wimplicit-function-declaration] if ((i= creat(output , 0644)) < 0) {

test3.c:70:18: error: use of undeclared identifier 'output' if ((i= creat(output , 0644)) < 0) {

这是我的代码:

#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "signal.h"
#include "unistd.h"

void prompt(char*);
void execute( char* );
char** parse( char* );

int main( int ac, char* av[] )
{
char input[255]; // buffer for supporting command

signal( SIGINT, SIG_IGN ); // ignore ctrl-c

while(1)
{
prompt(input);
execute( input );
}
};

void execute( char* str)
{
int fork_result, status, i = 0,j=0,in=0,out=0;
char input[100];output[100];
char** args = parse( str ); // splits the user command into arguments

fork_result = fork(); // attempt to fork
if ( fork_result == -1 ) // failure
{
perror("Failed to fork\n");
exit(1);
}
else if ( fork_result == 0 ) // I'm the child
{
for(i=0;args[i]!='\0';i++)
{
if(strcmp(args[i],"<")==0)
{
args[i]=NULL;
strcpy(input,args[i+1]);
in=2;
}
if(strcmp(args[i],">")==0)
{
args[i]=NULL;
strcpy(output,args[i+1]);
out=2;
}
}

if (in)
{
j = open(input, O_RDONLY, 0);
if ((j = open(input, O_RDONLY, 0)) < 0)
{
perror("Couldn't open input file");
exit(0);
}
dup2(j, 0);
close(j);
}

if (out)
{
if ((i= creat(output , 0644)) < 0)
{
perror("Couldn't open the output file");
exit(0);
}
dup2(i, STDOUT_FILENO);
close(i);
}

execvp( args[0], args );
perror("failed to exec\n");
exit(2);
}
else // I'm the parent
{
// wait here
wait(&status); // wait for child to finish
free( args ); // free dynamic memory
}
}

char** parse( char* str )
{
char** args = malloc( 256 );
int i = 0;

args[i] = strtok( str, " " );

while( args[i] )
{
i++;
args[i] = strtok( NULL, " " );
}

return args;
}

void prompt(char* input)
{
printf("$ "); // print prompt
fgets( input, 255, stdin );

input[strlen(input)-1] = '\0'; // overwrite \n with \0

if ( strcmp( input, "exit" ) == 0 ) // shell command
exit(0);
}

最佳答案

char input[100];output[100];

你想要:

char input[100], output[100];

同时添加:#include <fcntl.h>

一般来说,man open (以及您使用的其他功能)是您的 friend ——它告诉您什么 #include s 来补充。

您的代码中存在更多潜在错误和任意限制。一些例子:

void execute( char* str)
{
char input[100], output[100];
...
if(strcmp(args[i],"<")==0)
{
args[i]=NULL;
strcpy(input,args[i+1]); // possible stack buffer overflow.

if(strcmp(args[i],">")==0)
{
args[i]=NULL;
strcpy(output,args[i+1]); // possible stack buffer overflow


char** parse( char* str )
{
char** args = malloc( 256 ); // limit of 256/sizeof(char*) parameters.
// on a 64-bit system, if more than 32 parameters are supplied ...

args[i] = strtok( NULL, " " ); // ... possible heap buffer overflow.


fgets( input, 255, stdin ); // arbitrary limit of 254 characters on command line.

不能保证字符串以 \n 结尾:

  input[strlen(input)-1] = '\0'; // overwrite \n with \0

如果我给这个“shell ”打分,我会给它一个“F”。

关于c - 编写我自己的 shell,未声明的标识符 "output",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50662355/

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