回 帖 发 新 帖 刷新版面

主题:请教用fork实现的多进程编程问题

我现在想做一个实验,它是在linux下用c语言编的一个多进程程序;我想达到的要求是这样的:
程序运行以后在linux终端显示:


1.输入1为创建一个新进程;
2.输入2为察看我创建的进程;
3.输入3为删除进程;
4.退出程序;


当输入1后显示:您创建了一个新进程,进程号为:xxxx
1.输入1为创建一个新进程;
2.输入2为察看我创建的进程;
3.输入3为删除进程;
4.退出程序;


当输入2时显示:您目前创建的新进程共  x  个:
               1.(进程的一些信息,像用ps命令调用出来的结果那样)
               2.
               3.
                .
                .
               x.


1.输入1为创建一个新进程;
2.输入2为察看我创建的进程;
3.输入3为删除进程;
4.退出程序;


当输入3时显示:请输入您要删除的进程号:
  输入完毕显示:成功删除或您输入的进程号不是您所创建的,请重新输入或没有您   要删除的进程
1.输入1为创建一个新进程;
2.输入2为察看我创建的进程;
3.输入3为删除进程;
4.退出程序;


当输入4时退出,并杀死所有创建的子进程。



这个程序其实所实现的功能是我们老师给我们的一个事例程序,(老师要求我们做一个多线程的程序,我已经做完了。请各位放心,不是讨作业的)但是老师给我这个事例程序我就有几点想不明白;也就是说我想实现老师给的这个事例程序时遇到了麻烦。


我所不明白的是:fork函数使得子进程和父进程是完全克隆的关系,只有返回进程号不一样。那么我在循环里用scanf函数等待键盘输入时,键盘输入是给了父进程还是给了子进程?


希望高手指点,如果可能的话麻烦把上面我所要求的程序实现,贴出代码,我想看看您是怎么实现在父进程里循环输入的。




回复列表 (共7个回复)

沙发

Linux是一个多用户操作系统,在同一时间会有许多的用户在争夺系统的资源.有时 
进程为了早一点完成任务就创建子进程来争夺资源. 一旦子进程被创建,父子进程一起从 
fork处继续执行,相互竞争系统的资源.

fork()函数成功被调用的时候,有两个返回值,对于父进程来说是一个>0 子进程的id,对于子进程是0。

void main(void)
{   
    pid_t pid;
    int wait_state;  
    printf("hello\n");  
    pid = fork();      //子父进程开始从下面的程序共同执行
 
    if(pid==-1) 
        printf("failure!\n ");

    else if(pid==0)    //该条件对于子进程成立,子进程执行
    {
       printf("I am child!\n ");
       exit(0);       //子进程退出
    }
   else               //该条件对于父进程成立,父进程执行
       printf("my child is %d \n",pid); 

   wait(&wait_state);
     


可能的执行结果:
hello 
my child is 8650 
I am child!


“我在循环里用scanf函数等待键盘输入时,键盘输入是给了父进程还是给了子进程?”


——关键是看scanf函数在哪调用的。

板凳

非常感谢lvliang!
我有几点想问的是:
1、//子父进程开始从下面的程序共同执行
  这行之前的代码是不是在父子进程里也都同时存在?
2、您说的关键看scanf函数在哪调用,可能是说要想在父进程里实现输入就要在父进程里写(就是在那个“else  //该条件对于父进程成立,父进程执行”里面写);可是我总觉得这样写很难实现循环输入,能不能给我一个实现循环输入的例子啊?

3 楼

1.他们有同一个代码段
2. 参考,没有按你的要求
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <sys/types.h>
#include <wait.h>

void handle(int signo)
{
  int status;
  waitpid(-1,&status,WNOHANG); 
  return;
}

int CreatProess()
{
  pid_t pid;
  pid=fork();
  if(pid==0)
     pause();
  return pid;
}

int ViewProess(pid_t pid)
{
  system("ps aux");
  return 0;
}

int KillProess(pid_t pid)
{
  kill(pid,SIGTERM);
  return 0;
}

int main(int argc, char *argv[])
{
  int in;
  pid_t pid;

  signal(SIGCHLD,handle);
  
  do
  {
      printf("Please input a num:\n");
      scanf("%d",&in);

      switch(in)
      {
        case 1: pid=CreatProess(); printf("%d\n",pid);break;
        case 2: ViewProess(pid); break;
        case 3: KillProess(pid);break;   
       }
  }while(in!=4); 
  

  return 0;
}

4 楼

非常感谢您,这些天太忙了,才有机会说声谢谢,不好意思啊。谢谢。

5 楼

再次打扰您一下:
您给我的程序已经解决了我想了解的问题。但是我还想提一些假设。
就是:
在您的创建进程的函数里面
int CreatProcess()

 pid_t pid ;
 pid=fork();
 if(pid==0)
     pause();
 return pid;
}
在这个函数里面,您让子进程进行了暂停,那么假设我们不用pause(),而只是让它进行个可以自己结束的代码,例如:
int CreatProcess()

 pid_t pid ;
 pid=fork();
 if(pid==0)
     printf("子进程已经创建;");
 return pid;
}
这时,我有个新的问题就是:新创建的子进程在输出一个“子进程已经创建”后,由于其代码段是和父进程一样的,所以子进程是不是也将进入到main函数的do--while循环里?
在这种情况下,是不是就会产生当按下键盘输入时,输入的数就可能或者给了父进程里的scanf()又有可能给子进程里的scanf()?也就是说这时的父子两个进程都可以创建自己的子进程了?

6 楼

当然,要有目的的控制着子进程。

int CreatProcess()

 pid_t pid ;
 pid=fork();
 if(pid==0)
{
     printf("子进程已经创建;");
     exit(0);                        //让它退出
}
 return pid;
}

7 楼

太感谢您了!

我来回复

您尚未登录,请登录后再回复。点此登录或注册