Почему после выхода появляется дополнительный знак процента? - PullRequest
0 голосов
/ 26 декабря 2018

Я недавно изучаю функцию fork () под Linux.Я написал программу.

#include<stdio.h>
int main(){
    int p1, p2;
    while((p1 = fork()) == -1);
    if(p1 == 0)
        printf("b");
    else{
        while((p2 = fork()) == -1);
        if(p2 == 0)
            printf("c");
        else
            printf("a");
    }
}

После компиляции и запуска я получил неожиданный знак процента.

enter image description here

Ноесли я добавлю \ n после этих букв, знак процента исчезнет.

enter image description here

Кто-нибудь знает причину?

И яесть другой вопрос.Каждый раз, когда я перезапускал программу, я получал один и тот же ответ.Это всегда показывает «ACB».Порядок всегда один и тот же.Почему?

Ответы [ 2 ]

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

следующий предложенный код:

  1. правильно проверяет возвращаемое значение из fork()
  2. , правильно включает необходимые заголовочные файлы
  3. правильно ожидает дочерние процессыдля выхода до выхода из родительского процесса
  4. по-прежнему не завершает выходные строки с помощью \ n, поэтому (в этом случае) вывод не отображается на терминале до тех пор, пока не завершится процесс.
  5. использует правильную типизацию для переменных pid
  6. использует одну из двух действительных сигнатур для main()

А теперь предложенный код:

#include <stdio.h>     // printf(), perror()
#include <stdlib.h>    // exit(), EXIT_FAILURE, EXIT_SUCCESS
#include <sys/types.h> // pid_t
#include <unistd.h>    // fork()
#include <sys/wait.h>  // wait()

int main( void )
{
    pid_t p1;
    pid_t p2;

    p1 = fork();
    switch( p1 )
    {
        case -1:
            perror( "first fork failed" );
            exit( EXIT_FAILURE );
            break;

        case 0:  // child 1
            printf("child 1");
            exit( EXIT_SUCCESS );
            break;

        default:  // parent
            p2 = fork();
            switch( p2 )
            {
                case -1:
                    perror( "second fork failed" );
                    exit( EXIT_FAILURE );
                    break;

                case 0: // child 2
                    printf("child 2");
                    exit( EXIT_SUCCESS );
                    break;

                default:
                    printf("parent");
                    while( wait( NULL ) != -1 );
                    break;
            }  // end switch 2
    } // end switch 1
}

типичныйвыполнение кода приводит к:

child 2child 1parent
0 голосов
/ 26 декабря 2018

Ваша оболочка (zsh) добавила его, чтобы указать, что вывод не заканчивается символом новой строки.

Чтобы избавиться от него, просто завершите вывод с помощью \n.

Что касается другого вопроса, он не является детерминированным.Если вы запускаете его в другом месте или достаточно много раз, вы можете получить другие результаты.Но это иллюстрация того, почему проблемы с синхронизацией могут быть так трудно найти, потому что кажется, что все работает одинаково (почти) постоянно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...