如何解决从标准输入
我正在尝试从标准输入中读入并使用 execvp()
中的输入。
目前我收到很多警告,例如
警告:赋值从指针生成整数而无需强制转换 [-Wint-conversion] commands[i]=NULL;
警告:传递'execvp'的参数1使指针从整数而不进行强制转换[-Wint-conversion] execvp(commands2[0],commands2);
# include <stdlib.h>
# include <stdio.h>
# include <unistd.h>
# include <string.h>
# include <sys/wait.h>
# define BUF_SIZE 256
int main()
{
char buffer[BUF_SIZE];
char *commands;
char *commands2;
fgets(buffer,BUF_SIZE,stdin);
commands = strtok(buffer," ");
printf("%d",commands[0]);
while( commands != NULL )
{
printf( "%s",commands );
commands = strtok(NULL," ");
}
commands = realloc(commands,1);
int i = strlen(commands);
printf("%d",i);
commands[i]=NULL;
fgets(buffer,stdin);
commands2 = strtok(buffer," ");
while( commands2 != NULL )
{
commands2 = strtok(NULL," ");
}
commands2 = realloc(commands2,1);
int z = strlen(commands2);
printf("%d",z);
commands2[z]=NULL;
int my_pipe[2];
if (pipe(my_pipe) == -1)
{
perror("cannot create pipe\n");
}
pid_t my_pid;
my_pid = fork();
if (my_pid < 0)
{
perror("Failed fork\n");
}
if (my_pid > 0)
{
close(my_pipe[1]);
dup2(my_pipe[0],0);
close(my_pipe[0]);
wait(NULL);
execvp(commands2[0],commands2);
}
else
{
close(my_pipe[0]);
dup2(my_pipe[1],1);
close(my_pipe[1]);
execvp(commands[0],commands);
}
}
解决方法
首先有一个关于使用指针的混淆。
char *commands
是一个指针(指向一个字符)。
commands[i]
是一个字符(不是指针)。
NULL
是一个指针(类型为 void *
,值为 0
)
所以,你不能写commands[i]=NULL
。
但是您可以执行 commands[i]='\0'
(值 0 的字符)。
那么可能对 execvp()
预期的向量存在混淆。
这个向量(execvp 的 v)是一个(一维的)指针数组。
这些指针中的每一个都是一个 char *
、一个字符串、一个单词。
这个指针向量以指针 NULL 结束。
那么,我可以提出以下简单的代码吗(没有 fork() 和 pipe()):
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#define BUF_SIZE 256
#define MAX_ARGS 256
int main() {
char buffer[BUF_SIZE];
char *argv[MAX_ARGS];
int argc = 0;
fgets(buffer,BUF_SIZE,stdin);
for ( argv[argc] = strtok(buffer," \t\n");
argv[argc] != NULL;
argv[++argc] = strtok(NULL," \t\n") ) {
printf("argv[%d]=\"%s\"\n",argc,argv[argc]);
}
argv[argc] = NULL;
execvp(argv[0],argv);
perror(argv[0]);
exit(EXIT_FAILURE);
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。