为什么输出后会有多余的百分号?

时间:2018-12-26 13:11:57

标签: c linux fork

我最近正在Linux下学习fork()函数。我写了一个程序。

#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 :(得分:4)

您的shell(zsh)添加了它,以指示输出未以换行符结尾。

要摆脱它,只需以\n结尾即可。

关于另一个问题,这不是确定性的。如果您在其他地方或足够时间运行它,可能会得到不同的结果。但这说明了为什么很难找到同步问题,因为事情似乎总是(几乎)一直在运行。

答案 1 :(得分:0)

以下建议的代码:

  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