LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 632|回复: 10

调用system的问题

[复制链接]
发表于 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似乎没有道理执行两遍啊!我记得有什么输出行缓冲的问题,但我不是已经把输出设为不带缓冲了吗?实在想不通,请高手们指点一下!
发表于 2004-8-23 21:27:33 | 显示全部楼层
{}这个未被注释掉时,system() 仅为父进程执行。
{}这个被注释掉时,父进程和子进程都会执行一次system()
 楼主| 发表于 2004-8-23 22:04:48 | 显示全部楼层
子进程不是只执行if(pid==0)成立情况下的代码吗?怎么会执行到下面的程序段啊!我不知道我这样理解对不对,不对的话请指教!
发表于 2004-8-23 22:27:24 | 显示全部楼层
fork以后,子进程就和父进程分开执行,一直到程序结束
你看你写的,到程序结束是不是都要执行一下system?
发表于 2004-8-23 22:30:43 | 显示全部楼层

  1. if(pid == 0)
  2.     charp("output from child!\n");
  3. else
  4. // {
  5.     charp("output from parent!\n");
  6. system("ls");
  7. // }
复制代码

  1. if(pid == 0)
  2.     {
  3.      charp("output from child!\n");
  4.     }
  5. else
  6.     {
  7.      charp("output from parent!\n");
  8.     }
  9. system("ls");

复制代码

上面的两段代码是等价的。
 楼主| 发表于 2004-8-24 15:02:14 | 显示全部楼层

to lucifer

我刚开始学进程,对它的理解很不清楚,根本就不明白它们是怎么运行的,经过你的指点,我说一下自己的理解,不知道对不对:
在fork之后出现两个进程,一个是子进程,一个是父进程,它们共享程序代码,不同的地方只是子进程运行if(pid == 0)成立条件下的代码,父进程运行(pid > 0)成立条件下的代码,不在这两个条件判断下的代码两个进程共享,进程在遇到exit或运行到main结束时结束.
 楼主| 发表于 2004-8-24 15:06:39 | 显示全部楼层

to lollipop

谢谢你的指点
我主要是不知道进程创建之后,父进程和子进程是怎么运行的,就是它们分别运行那些代码也不清楚,虽然看了一些书,但还是不清楚!
发表于 2004-8-24 20:49:33 | 显示全部楼层
fork的英文含义是分叉,也就是从fork()开始,以后的代码就是两个进程分别执行了。fork()时系统要向父进程返回子进程的pid,同时向子进程返回0,所以如果在fork()之后的代码中判断一下fork()的返回值,就可以分别控制那些代码在父进程中运行和那些代码在子进程中运行。
发表于 2004-8-24 21:25:43 | 显示全部楼层
注释掉花括号后的system()一行不属于else控制的,而之前并非如此。
 楼主| 发表于 2004-8-25 13:22:00 | 显示全部楼层
书上也是说通过判断就知道哪些是父进程的,哪些是子进程的,这个我也理解,我现在想知道的是不在判断中的那些代码是不是父进程和子进程都要运行的.还有就是进程运行到什么地方结束,这些书上说的不是很清楚,情指点一下!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表