主题:请教用fork实现的多进程编程问题
cb54927487
[专家分:40] 发布于 2006-05-19 15:16:00
我现在想做一个实验,它是在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个回复)
沙发
lvliang [专家分:1680] 发布于 2006-05-19 21:11:00
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函数在哪调用的。
板凳
cb54927487 [专家分:40] 发布于 2006-05-21 12:35:00
非常感谢lvliang!
我有几点想问的是:
1、//子父进程开始从下面的程序共同执行
这行之前的代码是不是在父子进程里也都同时存在?
2、您说的关键看scanf函数在哪调用,可能是说要想在父进程里实现输入就要在父进程里写(就是在那个“else //该条件对于父进程成立,父进程执行”里面写);可是我总觉得这样写很难实现循环输入,能不能给我一个实现循环输入的例子啊?
3 楼
lvliang [专家分:1680] 发布于 2006-05-22 22:53:00
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 楼
cb54927487 [专家分:40] 发布于 2006-05-25 21:17:00
非常感谢您,这些天太忙了,才有机会说声谢谢,不好意思啊。谢谢。
5 楼
cb54927487 [专家分:40] 发布于 2006-06-04 12:46:00
再次打扰您一下:
您给我的程序已经解决了我想了解的问题。但是我还想提一些假设。
就是:
在您的创建进程的函数里面
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 楼
lvliang [专家分:1680] 发布于 2006-06-06 13:56:00
当然,要有目的的控制着子进程。
int CreatProcess()
{
pid_t pid ;
pid=fork();
if(pid==0)
{
printf("子进程已经创建;");
exit(0); //让它退出
}
return pid;
}
7 楼
cb54927487 [专家分:40] 发布于 2006-06-06 15:51:00
太感谢您了!
我来回复