随笔-145  评论-173  文章-70  trackbacks-0
 

Linux学习

1.操作系统的实验基本上都是以linux下面的系统编程为内容,进程的调度和创建都是很基本的内容。很幸运的是,linux为我们提供了很多的系统函数,供我们来使用。通过熟悉这些函数,使得我们可以能够对进程和程序有一个更良好的认识。

2.Fork函数的使用。下面引用自百度百科:

 fork()函数,Linux系统调用

  头文件:

  #include <unistd.h>

  函数定义:

  int fork( void );

  返回值:

  子进程中返回0,父进程中返回子进程ID,出错返回-1

  函数说明:

  一个现有进程可以调用fork函数创建一个新进程。由fork创建的新进程被称为子进程(child process)。fork函数被调用一次但返回两次。两次返回的唯一区别是子进程中返回0值而父进程中返回子进程ID

  子进程是父进程的副本,它将获得父进程数据空间、堆、栈等资源的副本。注意,子进程持有的是上述存储空间的副本,这意味着父子进程间不共享这些存储空间,它们之间共享的存储空间只有代码段。

  示例代码:

  #include <unistd.h>

  #include <stdio.h>

  int main(int argc, void ** argv )

  {

  int pid = fork();

  if(pid == -1 ) {

  // print("error!");

  } else if( pid = =0 ) {

  // print("This is the child process!");

  } else {

  // print("This is the parent process! child process id = %d", pid);

  }

  return 0;

  }

 

 

 

1.      下面来详细的说说我的程序和问题,通过比较学习,相信对于linux的学习,特别是进程和程序直接的关系有一个更好的理解。

Process2.c

Code

#include <stdio.h>

#include <unistd.h>

int main()

{

 int p1;

 p1=fork();

 if (p1 == 0)      //子进程,输出它的父进程和当前进程的PID

 {

     printf("current PID is %d\n",getpid());

     printf("father PID is %d\n",getppid());

     printf("\n");

 }

 else   //这里是父进程吗?

 {

     printf("father PID is %d\n",getppid());

     printf("current PID is %d\n",getpid());

     printf("\n");

 }

 return 0;

}

分析:此进程的运行结果是?(思考后再回答)

是的,有两种情况。首先,程序运行到fork语句之后,创建进程,此时有两种情况,创建成功和不成功,而成功又有两种情况,fork的返回值为0,则运行的是创建的子进程,fork的返回值为1,则运行的是父进程。用if语句来判断,OK

那么问题就是,if语句中没有问题,p10,说明创建成功,运行的是子进程,可是else语句来说,却又两种情况,如果创建不成功也在else语句中,那么此时当前进程就是那个原始的进程,而它的父进程却是1PID,因为所有的进程都是1号进程的子进程,这个是linux下面的结论。操作系统的知识。

所以,此时的结果应该是:

father PID is 32667

current PID is 15254

 

current PID is 15255

father PID is 1

先放着,先解释下面的这个,注意,这个对上面是有帮助的。

(看完之后回头过来看看),看到没有,首先输出的那个father PID是什么,刚好就是下面的那个32667,这个不是偶然的,说明什么,当然,这个进程就是父进程,而创建它的那个进程的PID32667,可以认为是系统创建的。就是说这种情况下面是,先运行的父进程。而它创建失败了,那么它没有子进程啊,那么那个下面的这个进程的父进程就不是上面的那个了,为何,从结果可以看到,它的PID1,而不会是15254,说明不是上面的那个创建。而创建却是1,说明是系统创建的,所以fork语句之后,没有创建成功,而是由系统来亲自创建一个进程,所以PID号当然是下一个,不过父进程就是1号了。(有兴趣的可以查阅下资料,我们也是刚学,所以我还有继续探究中!!

 

 

 

current PID is 15302 //子进程

father PID is 15301[l1]      

 

father PID is 32667 //父进程

current PID is 15301

 

PID = 13501

父进程

PID = 13504

子进程

系统创建了当前的那个父进程,就是程序运行的进程

PID = 32667

 

 

 

 

 

 

 

 

 

 

 

 

 


下面还想讨论这样一个问题,这个问题是从上面那个第一种情况引申来的。

如下:

Code

#include <stdio.h>

int main()

{

 int p1;

 while (( p1 = fork())!= -1);

 if (p1 == -1)

 {

    printf("current PID is %d\n",getpid());

    printf("father PID is %d\n",getppid());

 }

 return 0;

}[l2] 

 

 

结果如下,虽然比较多,不过很能说明问题:

current PID is 17600

father PID is 1

current PID is 17761

father PID is 1

current PID is 17602

father PID is 1

current PID is 18545

father PID is 1

current PID is 17608

father PID is 1

current PID is 17767

father PID is 1

current PID is 17624

father PID is 1

current PID is 17773

father PID is 1

current PID is 17616

father PID is 1

current PID is 18551

father PID is 1

current PID is 17630

father PID is 1

current PID is 18552

father PID is 1

current PID is 17636

father PID is 1

current PID is 17779

father PID is 1

current PID is 17642

father PID is 1

current PID is 17785

father PID is 1

current PID is 17648

father PID is 1

current PID is 17787

father PID is 1

current PID is 17654

father PID is 1

current PID is 17795

father PID is 1

current PID is 18510

father PID is 1

current PID is 17801

father PID is 1

current PID is 18511

father PID is 1

current PID is 17807

father PID is 1

current PID is 17656

father PID is 1

current PID is 17815

father PID is 1

current PID is 17384

father PID is 32667

current PID is 17819

father PID is 1

current PID is 17660

father PID is 1

father PID is 1

current PID is 17825

father PID is 1

current PID is 17668

father PID is 1

current PID is 18571

father PID is 1

father PID is 1

father PID is 1

father PID is 1

father PID is 1

current PID is 17672

father PID is 1

current PID is 18572

father PID is 1

current PID is 17678

father PID is 1

current PID is 17831

father PID is 1

father PID is 1

current PID is 17684

father PID is 1

current PID is 17839

father PID is 1

current PID is 17690

father PID is 1

current PID is 17845

father PID is 1

current PID is 17696

father PID is 1

current PID is 17851

father PID is 1

current PID is 17702

father PID is 1

current PID is 17857

father PID is 1

current PID is 17710

father PID is 1

current PID is 17863

father PID is 1

current PID is 18531

father PID is 1

current PID is 17786

father PID is 1

current PID is 17714

father PID is 1

current PID is 18566

father PID is 17786

current PID is 17720

father PID is 1

current PID is 18533

father PID is 1

current PID is 17728

father PID is 1

current PID is 18538

father PID is 1

current PID is 17730

father PID is 1

current PID is 18548

father PID is 17740

current PID is 17738

father PID is 1

current PID is 17794

father PID is 1

current PID is 17740

father PID is 1

current PID is 17804

father PID is 1

current PID is 17750

father PID is 1

current PID is 17810

father PID is 1

current PID is 17756

father PID is 1

current PID is 17814

father PID is 1

current PID is 17764

current PID is 17820

father PID is 1

father PID is 1

current PID is 17768

father PID is 1

current PID is 17826

father PID is 1

current PID is 17774

father PID is 1

current PID is 17832

father PID is 1

current PID is 17780

father PID is 1

current PID is 17838

father PID is 17913

father PID is 1

father PID is 17929

father PID is 17927

father PID is 1

father PID is 17941

father PID is 1

father PID is 17950

father PID is 1

 

看完了上面的那个例子,下面的这个例子就是小case了,当然,其实上面的那个例子就是由下面的这个例子引申来的,是因为写错了代码而引起的。当然,根据错误,我们收获不小啊!

Code

#include <stdio.h>

#include <unistd.h>

int main()

{

 int p1;

 while ((p1=fork())==-1) ;

 if (p1 == 0)

 {

     printf("current PID is %d\n",getpid());

     printf("father PID is %d\n",getppid());

     printf("\n");

 }

 else

 {

     printf("father PID is %d\n",getppid());

     printf("current PID is %d\n",getpid());

     printf("\n");

 }

 return 0;

}

 

结果如下:

current PID is 20312[l3] 

father PID is 20311

 

father PID is 32667

current PID is 20311

 

----------------------------------------------------------------------------------------------------------------

father PID is 32667

current PID is 20309[l4] 

 

current PID is 20310

father PID is 1


 [l1]父进程的PID刚好就是下面的那个父进程的current PID,说明下面的那个进程就是父进程。

 [l2]看看这个程序,虽然比较流氓,不过可以根据结果知道,如果创建失败的话,那么也会有一个当前的PID,而且还是由一个1号进程创建。

 [l3]当前是子进程,而它的父进程恰好是下面的这个进程!

 [l4]父进程就是这个进程,而它的那个子进程却是由系统创建的!


后来通过查阅资料知道,如果父进程创建一个子进程后其先结束,那么子进程就变成了孤儿进程,这样的话,就会由初始化进程,即1号进程来领养。所以会显示它的父进程为1.至此,完美的解决了。。

最近在看《Linux程序设计》(第三版)一书,收获颇丰。本书是Linux下面程序设计的经典,值得一睹。。而且最近的感触是,懂得linux的操作和会在Linux下面进程程序设计完全是两回事,就像你会用windows和会开发windows下面的程序一样。我辈任重而道远啊。。
posted on 2009-12-10 14:41 deercoder 阅读(299) 评论(0)  编辑 收藏 引用 所属分类: C/C++

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理