C语言 fgets不等待父进程中的输入,但它在子进程中等待输入

yzxexxkh  于 2022-12-22  发布在  其他
关注(0)|答案(1)|浏览(135)

这是一个设置环境变量的外部函数'

int mini_read(char ** variables){
    if(variables[1] == NULL){
        fprintf(stderr, "error\n");
        return 1;
    }
    char buf[100];
    fgets(buf, 100, stdin);

        //I doubt the bug is below here
    buf[strcspn(buf, "\n")] = 0;
    char ** valores = NULL;
    char * valor = strtok(buf, " \t");
    valores[0] = valor;
    int i = 1;
    // Guardar valores en array
    while(valor != NULL){
        valor = strtok(NULL, " \t");
        valores[i] = valor;
        i++;
    }
    for(int i = 1; ; i++){
        if(valores[i-1] == NULL) break;
        //printf("variables[%d]: %s\n valor[%d]: %c\n", i, variables[i], i, valor[i]);
        if(variables[i] == NULL){
            char*fin = NULL;
            //Si hay más valores que variables, concatenar valores
            for(int j = i-1; valores[j] != NULL; j++){
                printf("%s\n", fin);
                strcat(fin, valores[j]);
            }
            printf("%s\n", fin);
            setenv(variables[i-1], fin, 1);
            break;
        }
        setenv(variables[i], valores[i-1], 1);
    }
    return 0;

'
然后我想在父进程中调用这个函数,因为如果我从子进程调用它,环境变量不会被“全局”设置,如果我从子进程调用它,它工作得很好,但是如果我从父进程调用它,fgets()不等待输入。

int main(void){

pid = fork();

    if(pid == 0){
        //Option 1
        if(strcmp(argv[0], "read") == 0) mini_read(argv);
    }

    else{
        //Option 2
        if(strcmp(argv[0], "read") == 0) mini_read(argv);

        waitpid(pid, &wstatus, 0);      
    }

}`


有人知道吗?谢谢
xtfmy6hx

xtfmy6hx1#

char ** valores = NULL;
char * valor = strtok(buf, " \t");
valores[0] = valor;

您需要为valores保留空间,类似于:

char ** valores = malloc(sizeof(*valores) * (number_of_tabs + 1));
char * valor = strtok(buf, " \t");
valores[0] = valor;

由于您已经标记了Linux问题,因此可以考虑使用strsep而不是strtok

相关问题