deepwhite 于 2010-11-10 21:33:36发表:
(o):tx
wucongdonglai 于 2010-11-10 11:20:44发表:
2# deepwhite 还真如white兄所说的,父进程和子进程ID都相同的,呵呵,后面的我也实验了,white兄高见
deepwhite 于 2010-11-09 19:13:27发表:
引用:进程2对之前的文件流的关系是怎么样的?是属于进程1还是进程2?
引用: 如果要关闭文件流,该在哪关闭,要读取文件流的数据,是不是不用指明文件流?
引用: 另外进程1还有没有重新继续执行的机会?我在进程2里用execl()函数重新切到进程1,发现它是从头开始运行的。
deepwhite 于 2010-11-10 21:33:36发表:
(o):tx
wucongdonglai 于 2010-11-10 11:20:44发表:
2# deepwhite
还真如white兄所说的,父进程和子进程ID都相同的,呵呵,后面的我也实验了,white兄高见
deepwhite 于 2010-11-09 19:13:27发表:
execv 这个家族的系统调用,会用参数中指定的可执行文件的镜像来代替正在执行的文件,也就是说,只有一个进程,这个进程先执行程序A,后执行程序B,执行过程中进程的 PID 和 PPID 始终是一样的,也就是说,不存在你说的 “ 进程 1 和进程 2”,只有一个进程。
你可以写个小程序证明这一点。
由于两个镜像(假设为 A 和 B)使用的是同一个进程,前一个镜像(A)打开的文件流(在 Linux 中可以用fd来表示)仍然存在内核中,你可以通过在执行execl() 的时候将 fd 作为参数传给 B ,然后在 B 中从参数中获取 fd ,再对 fd 进行操作。
前面你说了”文件流“ , 这个东西应该是标准 C 中用到的,文件流和 fd 并不等同,之间需要做个转换,但我没接触过这种转换,一般情况下我直接用 Linux 系统调用中的 open 来获取文件描述符,而不用 fopen() 来获取 FILE *, 尽管后者的可移植性更好一些。
我觉得是没有了。