我最近正在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");
}
}
编译并运行它之后,出现了意外的百分号。
但是,如果我在这些字母后面加上\ n,百分号就会消失。
有人知道原因吗?
还有另一个问题。每次我重新运行该程序时,都会得到相同的答案。它始终显示“ acb”。顺序总是相同的。为什么?
答案 0 :(得分:4)
您的shell(zsh)添加了它,以指示输出未以换行符结尾。
要摆脱它,只需以\n
结尾即可。
关于另一个问题,这不是确定性的。如果您在其他地方或足够时间运行它,可能会得到不同的结果。但这说明了为什么很难找到同步问题,因为事情似乎总是(几乎)一直在运行。
答案 1 :(得分:0)
以下建议的代码:
fork()
返回的值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