当前时区为 UTC + 8 小时



发表新帖 回复这个主题  [ 5 篇帖子 ] 
作者 内容
1 楼 
 文章标题 : fork问题
帖子发表于 : 2011-05-19 15:05 

注册: 2008-09-26 1:12
帖子: 11
送出感谢: 0 次
接收感谢: 0 次
代码如下
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


页首
 用户资料  
 
2 楼 
 文章标题 : Re: fork问题
帖子发表于 : 2011-05-19 16:52 
头像

注册: 2008-12-24 12:02
帖子: 108
送出感谢: 1
接收感谢: 4
貌似沒什麼關係?貌似而已 :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,這樣沒問題了。


_________________
機器生命


页首
 用户资料  
 
3 楼 
 文章标题 : Re: fork问题
帖子发表于 : 2011-05-19 17:28 

注册: 2008-09-26 1:12
帖子: 11
送出感谢: 0 次
接收感谢: 0 次
也就是说fork的时候 父子进程都同时从fork开始了,都进行了fork()<0的比较,第二步结果吧0赋值给了pid所以结果都成了0,
明白了,一直怀疑是从fork产生后父子才分离,以为都是fork之后带代码了,没想到fork还是起作用,进行了赋值,3Q


_________________
内事不决问百度,外事不决问google


页首
 用户资料  
 
4 楼 
 文章标题 : Re: fork问题
帖子发表于 : 2011-05-19 18:36 
头像

注册: 2008-12-24 12:02
帖子: 108
送出感谢: 1
接收感谢: 4
確實是 fork 後父子才分離的呀。
貌似你還沒明白 :P

我的意思是沒明白 c 語言,而不是沒明白 fork()


_________________
機器生命


页首
 用户资料  
 
5 楼 
 文章标题 : Re: fork问题
帖子发表于 : 2011-06-30 6:56 
头像

注册: 2008-07-30 23:21
帖子: 13427
地址: freebuilder@yeah.net
系统: Debian stable AMD64
送出感谢: 38
接收感谢: 127
songshtao 写道:
代码如下
查了运算符优先级 貌似没什么关系

都查了还没看出来?

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


_________________
(2015-11-16 更新)适合 WM 的截图脚本
(2015-08-24 更新)Debian、Ubuntu 源列表说明
(2013-02-01 首发)文字如何绘出
▷▷ 【更 多 在 此】 ◁◁
箪食瓢饮随遇安,不求栋梁求参天。
【初韵】一门牛逼的编程语言。


页首
 用户资料  
 
显示帖子 :  排序  
发表新帖 回复这个主题  [ 5 篇帖子 ] 

当前时区为 UTC + 8 小时


在线用户

正在浏览此版面的用户:没有注册用户 和 1 位游客


不能 在这个版面发表主题
不能 在这个版面回复主题
不能 在这个版面编辑帖子
不能 在这个版面删除帖子
不能 在这个版面提交附件

前往 :  
本站点为公益性站点,用于推广开源自由软件,由 DiaHosting VPSBudgetVM VPS 提供服务。
我们认为:软件应可免费取得,软件工具在各种语言环境下皆可使用,且不会有任何功能上的差异;
人们应有定制和修改软件的自由,且方式不受限制,只要他们自认为合适。

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
简体中文语系由 王笑宇 翻译