设为首页
收藏本站
用户名
Email
自动登录
找回密码
密码
登录
注册
快捷导航
平台
Portal
论坛
BBS
文库
项目
群组
Group
我的博客
Space
搜索
搜索
热搜:
shell
linux
mysql
本版
用户
LinuxSir.cn,穿越时空的Linuxsir!
»
论坛
›
编程开发讨论区 —— LinuxSir.cn
›
Linux 程序设计专题讨论
›
调用system的问题
1
2
/ 2 页
下一页
返回列表
查看:
632
|
回复:
10
调用system的问题
[复制链接]
xyh_xkt
xyh_xkt
当前离线
积分
75
IP卡
狗仔卡
发表于 2004-8-23 20:24:22
|
显示全部楼层
|
阅读模式
我的程序如下:
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
static void charp(char *);
int main()
{
pid_t pid;
if((pid = fork()) < 0)
printf("fork error!\n");
else if(pid == 0)
charp("output from child!\n");
else
// {
charp("output from parent!\n");
system("ls");
// }
exit(0);
}
static void charp(char * str)
{
char *ptr;
int c;
setbuf(stdout,NULL);
for(ptr = str;c = *ptr ++; )
putchar(c);
}
我的程序中有一对大括号被注释掉了,问题就出在这里:如果不注释掉,system只运行一遍,运行结果如下:
[root@localhost learn]# ./kk
output from child!
output from parent!
fork.c fork.c~ kk pipe.c pipe.c~
如果注释掉了,system就运行两遍,运行结果如下:
[root@localhost learn]# ./kk
output from child!
fork.c fork.c~ kk pipe.c pipe.c~
output from parent!
fork.c fork.c~ kk pipe.c pipe.c~
我想不明白为什么会这样,system似乎没有道理执行两遍啊!我记得有什么输出行缓冲的问题,但我不是已经把输出设为不带缓冲了吗?实在想不通,请高手们指点一下!
回复
使用道具
举报
提升卡
置顶卡
沉默卡
喧嚣卡
变色卡
显身卡
lollipop
lollipop
当前离线
积分
210
IP卡
狗仔卡
发表于 2004-8-23 21:27:33
|
显示全部楼层
{}这个未被注释掉时,system() 仅为父进程执行。
{}这个被注释掉时,父进程和子进程都会执行一次system()
回复
支持
反对
使用道具
举报
显身卡
xyh_xkt
xyh_xkt
当前离线
积分
75
IP卡
狗仔卡
楼主
|
发表于 2004-8-23 22:04:48
|
显示全部楼层
子进程不是只执行if(pid==0)成立情况下的代码吗?怎么会执行到下面的程序段啊!我不知道我这样理解对不对,不对的话请指教!
回复
支持
反对
使用道具
举报
显身卡
lucifer
lucifer
当前离线
积分
750
IP卡
狗仔卡
发表于 2004-8-23 22:27:24
|
显示全部楼层
fork以后,子进程就和父进程分开执行,一直到程序结束
你看你写的,到程序结束是不是都要执行一下system?
回复
支持
反对
使用道具
举报
显身卡
lollipop
lollipop
当前离线
积分
210
IP卡
狗仔卡
发表于 2004-8-23 22:30:43
|
显示全部楼层
if(pid == 0)
charp("output from child!\n");
else
// {
charp("output from parent!\n");
system("ls");
// }
复制代码
if(pid == 0)
{
charp("output from child!\n");
}
else
{
charp("output from parent!\n");
}
system("ls");
复制代码
上面的两段代码是等价的。
回复
支持
反对
使用道具
举报
显身卡
xyh_xkt
xyh_xkt
当前离线
积分
75
IP卡
狗仔卡
楼主
|
发表于 2004-8-24 15:02:14
|
显示全部楼层
to lucifer
我刚开始学进程,对它的理解很不清楚,根本就不明白它们是怎么运行的,经过你的指点,我说一下自己的理解,不知道对不对:
在fork之后出现两个进程,一个是子进程,一个是父进程,它们共享程序代码,不同的地方只是子进程运行if(pid == 0)成立条件下的代码,父进程运行(pid > 0)成立条件下的代码,不在这两个条件判断下的代码两个进程共享,进程在遇到exit或运行到main结束时结束.
回复
支持
反对
使用道具
举报
显身卡
xyh_xkt
xyh_xkt
当前离线
积分
75
IP卡
狗仔卡
楼主
|
发表于 2004-8-24 15:06:39
|
显示全部楼层
to lollipop
谢谢你的指点
我主要是不知道进程创建之后,父进程和子进程是怎么运行的,就是它们分别运行那些代码也不清楚,虽然看了一些书,但还是不清楚!
回复
支持
反对
使用道具
举报
显身卡
kj501
kj501
当前离线
积分
5317
IP卡
狗仔卡
发表于 2004-8-24 20:49:33
|
显示全部楼层
fork的英文含义是分叉,也就是从fork()开始,以后的代码就是两个进程分别执行了。fork()时系统要向父进程返回子进程的pid,同时向子进程返回0,所以如果在fork()之后的代码中判断一下fork()的返回值,就可以分别控制那些代码在父进程中运行和那些代码在子进程中运行。
回复
支持
反对
使用道具
举报
显身卡
lanche
lanche
当前离线
积分
370
IP卡
狗仔卡
发表于 2004-8-24 21:25:43
|
显示全部楼层
注释掉花括号后的system()一行不属于else控制的,而之前并非如此。
回复
支持
反对
使用道具
举报
显身卡
xyh_xkt
xyh_xkt
当前离线
积分
75
IP卡
狗仔卡
楼主
|
发表于 2004-8-25 13:22:00
|
显示全部楼层
书上也是说通过判断就知道哪些是父进程的,哪些是子进程的,这个我也理解,我现在想知道的是不在判断中的那些代码是不是父进程和子进程都要运行的.还有就是进程运行到什么地方结束,这些书上说的不是很清楚,情指点一下!
回复
支持
反对
使用道具
举报
显身卡
下一页 »
1
2
/ 2 页
下一页
返回列表
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
|
注册
本版积分规则
发表回复
回帖后跳转到最后一页
Copyright © 2002-2023
LinuxSir.cn
(http://www.linuxsir.cn/) 版权所有 All Rights Reserved.
Powered by
RedflagLinux!
技术支持:
中科红旗
|
京ICP备19024520号
快速回复
返回顶部
返回列表