红联Linux门户
Linux帮助

进程切换的问题

发布时间:2010-11-09 13:54:25来源:红联作者:wucongdonglai
最近看《linux程序设计》一书,比如说在进程a中,通过freopen()函数,打开了file.txt,并相关联一个文件流,在此之后又调用execl()函数,把当前进程切换到进程2,那进程2对之前的文件流的关系是怎么样的?是属于进程1还是进程2?如果要关闭文件流,该在哪关闭,要读取文件流的数据,是不是不用指明文件流?
另外进程1还有没有重新继续执行的机会?我在进程2里用execl()函数重新切到进程1,发现它是从头开始运行的。
文章评论

共有 3 条评论

  1. deepwhite 于 2010-11-10 21:33:36发表:

    (o):tx

  2. wucongdonglai 于 2010-11-10 11:20:44发表:

    2# deepwhite
    还真如white兄所说的,父进程和子进程ID都相同的,呵呵,后面的我也实验了,white兄高见

  3. deepwhite 于 2010-11-09 19:13:27发表:

    引用:
    进程2对之前的文件流的关系是怎么样的?是属于进程1还是进程2?

    execv 这个家族的系统调用,会用参数中指定的可执行文件的镜像来代替正在执行的文件,也就是说,只有一个进程,这个进程先执行程序A,后执行程序B,执行过程中进程的 PID 和 PPID 始终是一样的,也就是说,不存在你说的 “ 进程 1 和进程 2”,只有一个进程。

    你可以写个小程序证明这一点。

    引用:

    如果要关闭文件流,该在哪关闭,要读取文件流的数据,是不是不用指明文件流?

    由于两个镜像(假设为 A 和 B)使用的是同一个进程,前一个镜像(A)打开的文件流(在 Linux 中可以用fd来表示)仍然存在内核中,你可以通过在执行execl() 的时候将 fd 作为参数传给 B ,然后在 B 中从参数中获取 fd ,再对 fd 进行操作。

    前面你说了”文件流“ , 这个东西应该是标准 C 中用到的,文件流和 fd 并不等同,之间需要做个转换,但我没接触过这种转换,一般情况下我直接用 Linux 系统调用中的 open 来获取文件描述符,而不用 fopen() 来获取 FILE *, 尽管后者的可移植性更好一些。

    引用:

    另外进程1还有没有重新继续执行的机会?我在进程2里用execl()函数重新切到进程1,发现它是从头开始运行的。


    我觉得是没有了。