fork问题

C、C++和Java语言
回复
songshtao
帖子: 11
注册时间: 2008-09-26 1:12
送出感谢: 0
接收感谢: 0
联系:

fork问题

#1

帖子 songshtao » 2011-05-19 15:05

代码如下
1 #include <stdlib.h>
2 #include <stdio.h>
3
4 int main()
5 {
6 pid_t pid;
7 int k=55;
8
9 if(pid=fork()<0)
10 perror("fork error");
11
12 if(pid==0){
13 k++;
14 }
15 //system("ps -al");
16 printf("getpid=%d,pid=%d,kkk=%d\n",getpid(),pid,k);
17 return 0;
18 }
运行后进程号不一样,但变量k都一样被++了
后来吧19行if拍段修改为
9 if((pid=fork())<0)
运行正常,只有pid=0的子进程被++了
查了运算符优先级 貌似没什么关系
我想知道为什么那个判断没加括号后变量k貌似成了共享的变量,或者说子进程的k++为什么再父进程里也运行了
什么原因
内事不决问百度,外事不决问google
头像
Kandu
帖子: 108
注册时间: 2008-12-24 12:02
送出感谢: 1 次
接收感谢: 4 次
联系:

Re: fork问题

#2

帖子 Kandu » 2011-05-19 16:52

貌似沒什麼關係?貌似而已 :P

if(pid=fork()<0)

裡面 = 的優先級不如 <,於是 c 就開始計算 fork()<0 的值,因為你調用成功,所以父子行程都得到 false 值,也就是 0。然後再是 =,把 0 賦值給變數 pid,於是父子行程的變數 pid 值都為 0.
之後是

if(pid==0){
k++;
}

測試變數 pid 的值是否為0,因為父子行程的變數 pid 值都為0,所以就都執行了 k++

後面的改過的程式的話,加了括號改變運算次序,就 Ok 了。先把 pid 寫入變數 pid,然後再判斷變數 pid 是否小於0,這樣沒問題了。
songshtao
帖子: 11
注册时间: 2008-09-26 1:12
送出感谢: 0
接收感谢: 0
联系:

Re: fork问题

#3

帖子 songshtao » 2011-05-19 17:28

也就是说fork的时候 父子进程都同时从fork开始了,都进行了fork()<0的比较,第二步结果吧0赋值给了pid所以结果都成了0,
明白了,一直怀疑是从fork产生后父子才分离,以为都是fork之后带代码了,没想到fork还是起作用,进行了赋值,3Q
内事不决问百度,外事不决问google
头像
Kandu
帖子: 108
注册时间: 2008-12-24 12:02
送出感谢: 1 次
接收感谢: 4 次
联系:

Re: fork问题

#4

帖子 Kandu » 2011-05-19 18:36

確實是 fork 後父子才分離的呀。
貌似你還沒明白 :P

我的意思是沒明白 c 語言,而不是沒明白 fork()
头像
自由建客
论坛版主
帖子: 13436
注册时间: 2008-07-30 23:21
系统: Debian stable AMD64
来自: freebuilder@yeah.net
送出感谢: 12 次
接收感谢: 112 次
联系:

Re: fork问题

#5

帖子 自由建客 » 2011-06-30 6:56

songshtao 写了:代码如下
查了运算符优先级 貌似没什么关系
都查了还没看出来?

fork 是复制进程,父进程调用 fork() 后从哪开始,子进程也就从哪点开始。
回复

回到 “C/C++/Java”