Fgets () блокирует стандартный вывод, предотвращающий printf - PullRequest
0 голосов
/ 11 декабря 2018

У меня есть программа на C с двумя потоками, один из которых почти все время заблокирован в fgets() в ожидании ввода пользователя.Второй поток, возможно, должен будет печатать в терминал, в то время как первый заблокирован на fgets().

. Из моих тестов кажется, что программа ожидает возврата fgets() в первом потоке, а затемВторой поток можно распечатать.

Это тот, кто работает, или я могу напечатать, пока другая нить заблокирована на fgets()?

Эта реализация работает на eCos (встроенная конфигурируемая операционная система).

Поток заблокирован на fgets():

int my_getline (char** argv, int argvsize)
{
    static char line[MAX_LINE];
    char *p;
    int argc;

    fgets(line, MAX_LINE, stdin);


    for (argc=0,p=line; (*line != '\0') && (argc < argvsize); p=NULL,argc++) {
        p = strtok(p, " \t\n");
        argv[argc] = p;
        if (p == NULL) return argc;
    }
    argv[argc] = p;
    return argc;
}

Поток, пытающийся напечатать:

while(1){
        unsigned char bufr[50];
        read_until(bufr);
        if (bufr[1] == (unsigned char)NMFL ){
            cyg_mutex_lock(&scree_mtx);
            printf("Memory half full!\n");
            cyg_mutex_unlock(&scree_mtx);
            continue;
        }
        cyg_mbox_put( mbx_serial_userH, bufr );     
}

Вывод (я уверен, что сообщение было там раньше):

Output

1 Ответ

0 голосов
/ 12 декабря 2018

Стандарт C вообще не устанавливает никакой связи между стандартным входным потоком и стандартным выходным потоком.В частности, в нем не указано, что блокировка одного потока при чтении из стандартного ввода через какую-либо стандартную функцию должна вызывать блокировку любой функции вывода.

ОДНАКО, в стандарте также не сказано обратное, что потокблокировка на входе от stdin не должна приводить к блокировке другого на выходе на stdout.То, что это произойдет, будет зависеть от реализации C и, возможно, от конкретных устройств, с которыми связаны stdin и stdout.

Вы, похоже, используете реализацию Windows C с stdin иstdout оба подключены к окну CMD.EXE.В Windows много специфических особенностей, и я склонен предположить, что блокировка, которую вы наблюдаете, является одной из них.Я не ожидал бы того же в Linux или OSX, но это не значит, что он ошибочен.

...