日期:2014-05-16  浏览次数:20683 次

Linux 下的fork的问题,实在是不知到要在哪里提问了

// 代码1
int main(void)
{
int i=0;
printf("i son/pa ppid pid fpid/n");
//ppid指当前进程的父进程pid
//pid指当前进程的pid,
//fpid指fork返回给当前进程的值
for(i=0;i<2;i++){
pid_t fpid=fork();
if(fpid==0)
printf("%d child %4d %4d %4d/n",i,getppid(),getpid(),fpid);
else
printf("%d parent %4d %4d %4d/n",i,getppid(),getpid(),fpid);
}
return 0;
}
// 输出结果
// i son/pa ppid pid fpid
// 0 parent 2043 3224 3225
// 0 child 3224 3225 0
// 1 parent 2043 3224 3226
// 1 parent 3224 3225 3227
// 1 child 1 3227 0
// 1 child 1 3226 0
// 这里我有一个小问题是这样的,这里并没有任何的阻塞,为什么子进程和父进程并没有串行执行?


// 代码2
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>

int main()
{
printf("PPid = %d, Pid = %d\n", getppid(), getpid());
char s[50];
int pid = fork();
if(pid < 0) {
printf("pid < 0\n");
return -1;
}
else if(pid == 0) {
printf("scanf some words: %d\n", getpid());
scanf("%s", s);
pid = fork();
if(pid <= 0) wait(NULL);
else printf("The Words Are %s %d %d\n", s, getppid(), getpid());
exit(0);
}
else {
wait(NULL);
pid = fork();
if(pid <= 0)
wait(NULL);
else
printf("The Words Are %s %d\n", s, getpid());
printf("Child Complete! %d\n", getpid());
}
return 0;
}
// 我是想用父进程创建两个子进程,一个接收键盘的输入,一个输出键盘的输入,结果。。。。
// 输出
// PPid = 5848, Pid = 5906
// scanf some words: 5907
// aaaaaa
// The Words Are aaaaaa 5906 5907
// The Words Are  5906
// Child Complete! 5906
// Child Complete! 5909
// 这里就更不能理解了,请讲解一下调用顺序,我真的不理解,刚学完全不会


谢谢啦!
linux c fork

------解决方案--------------------
1 fork创建的进程无法确认是哪个进程首先执行的!
 只有vfork才能保证先后顺序的!
2 进程都有自己独立的缓冲区的吧?
------解决方案--------------------
>子进程是指已经fork的一个进程执行的fork,5907和5907,完全一样。
fork以后的子进程到了if给你wait了。父进程进else,因为父进程还是父进程,所以还是5907
>即使我执行两次,也不会出现两个同时出现在一个终端界面的情况
用的都是stdout当然输出在一起。你那个printf 1的例子实在是在说瞎话。你“执行两次”,后一个进程开始的时候前一个进程都结束了。和fork有可比性?