从标准输入

问题描述

我正在尝试从标准输入中读入并使用 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);
    }