当前位置: 技术问答>linux和unix
关于fork()的问题
来源: 互联网 发布时间:2016-09-06
本文导语: #include int main ( int argc, char *argv[] ) { int ret_form_fork, mypid; mypid = getpid(); printf("Before: my pid is %dn", mypid); ret_form_fork = fork(); sleep(1); printf("after: my pid is %d, fork() said %dn", getpid(), ret_form_fork); return 0; } /* -...
#include
int main ( int argc, char *argv[] )
{
int ret_form_fork, mypid;
mypid = getpid();
printf("Before: my pid is %dn", mypid);
ret_form_fork = fork();
sleep(1);
printf("after: my pid is %d, fork() said %dn", getpid(), ret_form_fork);
return 0;
} /* ---------- end of function main ---------- */
以上这个代码,我感觉应该父进程的after先输出阿,怎么结果是子进程的先输出阿,执行结果为:
Before: my pid is 2081
after: my pid is 2082, fork() said 0
after: my pid is 2081, fork() said 2082
和我的感觉,以及书上的结果不一样
第二个问题
#include
#include
#include
#include
int
main ( int argc, char *argv[] )
{
pid_t pid;
char *message;
int n;
printf("fork program startingn");
pid = fork();
switch( pid )
{
case -1:
perror("fork error!n");
exit(1);
case 0:
message = "child process";
n = 5;
break;
defult:
message = "parents process";
n = 3;
break;
}
for (; n > 0; n--)
{
puts(message);
sleep(1);
}
return 0;
} /* ---------- end of function main ---------- */
这一个简单的代码对于parents process这句,总是输出乱码,这么不理解呢。
小弟初学,感觉这个都很简单,怎么一在电脑上实践都是问题呢。。。
|
第一个问题,为什么“感觉应该父进程的after先输出”?
fork先在父进程返回还是先在子进程返回,是不确定的。
那个sleep,父进程和子进程都会执行,所以貌似没什么作用。
fork先在父进程返回还是先在子进程返回,是不确定的。
那个sleep,父进程和子进程都会执行,所以貌似没什么作用。
|
你这个代码就是有竞争条件阿。
参考 APUE 第二版 第八章的介绍
参考 APUE 第二版 第八章的介绍
|
break;
defult: // ??????
message = "parents process";
defult: // ??????
message = "parents process";
|
gcc把defult当成了一个标号
$ gcc -Wall test.c
test.c: In function âmainâ:
test.c:26: warning: label âdefultâ defined but not used
要是再在什么地方加一个goto defult 那就连这个警告都没有了
代码贴出来关键字比如case和break都是蓝色的,default也会是蓝色的
$ gcc -Wall test.c
test.c: In function âmainâ:
test.c:26: warning: label âdefultâ defined but not used
要是再在什么地方加一个goto defult 那就连这个警告都没有了
代码贴出来关键字比如case和break都是蓝色的,default也会是蓝色的