代码如下
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++为什么再父进程里也运行了
什么原因
fork问题
- Kandu
- 帖子: 108
- 注册时间: 2008-12-24 12:02
- 联系:
Re: fork问题
貌似沒什麼關係?貌似而已
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,這樣沒問題了。
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,這樣沒問題了。
-
- 帖子: 11
- 注册时间: 2008-09-26 1:12
- 联系:
Re: fork问题
也就是说fork的时候 父子进程都同时从fork开始了,都进行了fork()<0的比较,第二步结果吧0赋值给了pid所以结果都成了0,
明白了,一直怀疑是从fork产生后父子才分离,以为都是fork之后带代码了,没想到fork还是起作用,进行了赋值,3Q
明白了,一直怀疑是从fork产生后父子才分离,以为都是fork之后带代码了,没想到fork还是起作用,进行了赋值,3Q
内事不决问百度,外事不决问google
- Kandu
- 帖子: 108
- 注册时间: 2008-12-24 12:02
- 联系:
- 自由建客
- 帖子: 13468
- 注册时间: 2008-07-30 23:21
- 系统: Debian stable AMD64
Re: fork问题
都查了还没看出来?songshtao 写了:代码如下
查了运算符优先级 貌似没什么关系
fork 是复制进程,父进程调用 fork() 后从哪开始,子进程也就从哪点开始。