免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
1234下一页
最近访问板块 发新帖
查看: 4446 | 回复: 30
打印 上一主题 下一主题

求教:使用 fork() 的方法 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2003-03-02 15:44 |只看该作者 |倒序浏览
刚刚来到这个论坛,先向大家问个好。

今天第一次在程式中用fork(),实在是不知道应该怎样做。我的问题是,如果要在parent进程 和 child进程中来回切换,比如说在parent进程执行一次,就切换到child进程中, 然后再回到parent, 应该怎样做?

哪位如有时间指点一二,将不胜感激。

谢谢。

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
2 [报告]
发表于 2003-03-02 15:58 |只看该作者

求教:使用 fork() 的方法

你有必要了解unix os的一些基本概念.

unix是一种分时系统,你可以认为各个进程是并行执行的.

你只能让进程在适当的时候等待或者执行,而不是简单的切来切去.

至于父子进程怎么协调执行,这就要用到进程间的通信机制了.

比较常用的有信号量,共享内存,消息队列等.

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
3 [报告]
发表于 2003-03-02 15:59 |只看该作者

求教:使用 fork() 的方法

依我看来,你根本就没有明白什么叫“进程”,以及“父进程”和“子进程”是什么关系。

论坛徽章:
0
4 [报告]
发表于 2003-03-02 16:19 |只看该作者

求教:使用 fork() 的方法

回 gadfly and flw,

谢谢两位即时回复。我是刚刚开始学写multiple processes,所以很多地方都是非常不清楚。

gadfly, 请问我是不是应该用shmget 呢?还有你提到的“有信号量,共享内存,消息队列", 可不可以建议几个适用的Sys call 的function呢?

多谢各位的时间。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
5 [报告]
发表于 2003-03-02 16:24 |只看该作者

求教:使用 fork() 的方法

问题是这样的,shmget 怎么用,我可以告诉你,不过这些比较系统的知识,最终应该从书
本上获取
。我给你推荐一本书,名字叫《UNIX 进程间通讯》,是外文翻译的,翻译质量挺好。
等你看了这本书后,如果有什么不明白的地方,欢迎来问我。
我的联系方式见资料。

论坛徽章:
0
6 [报告]
发表于 2003-03-02 16:25 |只看该作者

求教:使用 fork() 的方法

不懂就问是没错,招惹楼上两位N人不顾身份不辞辛苦的来涮你,就是你的不对了

下回要记住:不懂还可以装懂的,懂了也不能说,要用来拿人家开涮


要玩IPC,从 fork() 开刀 一点也没错!


----------------------
fork();      //创建一个新进程

system(); ┓
exec(); ━┛//用新的程序覆盖旧程序实现进程转化
wait();     //等待进程终止
exit();     //终止一个进程的运行
------------------------------------------------------------------------
1.产生新的进程
  fork();
      sample:
        main(argc,argv)
         int argc;
         char * *argv;
         {
         int pid[10];
         int i,j;

         j=argv[1][0]-48;
         for(i=0;i<=j;i++)
           {
           printf("i=%i\n",i);
           pid=fork();
           }
         }

2.获得进程号
  int getpid();   //返回调用的进程号
  int getppid();  //返回调用的进程父进程号
  int getuid();   //返回调用的进程的实在用户标识号
  int geteuid();  //返回调用的进程的有效用户标识号
  int getgid();   //返回调用的进程的实在用户组标识号
  int getegid();  //返回调用的进程的不效用户组标识号

3.中断退出:
3.中断退出:
  abort();        //强行退出,会core dump.
  exit(int n);    //程序正常终止.  写出缓冲区
  _exit(int n);   //程序正常终止.  不写出缓冲区
  atexit(fun);    //到fun函数正常终止时,才运行exit();<==>;:
       sample;                                       (1) 等到fun函数结束
          main()                                     (2) 运行exit();
          {
           void fun();
           int i;
           scanf("%d",&amp;i);
           if (i==1)
             atexit(fun);
           else
             printf("%d\n",i);
          }

          void fun()
          {
          int m=0;
          while(m<=4)
           {
            sleep(1);

            m++;
           }
          }

4.在程序中去执行(shell)命令:<stdio.h>;<stdlib.h>;
  int i=system("lf";    //i=0(true),i=-1(false);
  int i=execl("ls";     //exec..("  "

5.wait()  //实现进程的同步
  while(wait(&amp;status)!=childpid);  //int status;int childpid=fork();
      sample:
        main()
        {
        int status;
        int childpid;
        if((childpid=fork())==0)
          {
           sleep(4);
           printf("%s\n","child";
          }
        else

       else
          {
           while(wait(&amp;status)!=childpid);   //注意用分号
           printf("%s\n","parent";
          }
       }

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
7 [报告]
发表于 2003-03-02 16:31 |只看该作者

求教:使用 fork() 的方法

原帖由 "asky78" 发表:
不懂就问是没错,招惹楼上两位N人不顾身份不辞辛苦的来涮你,就是你的不对了

下回要记住:不懂还可以装懂的,懂了也不能说,要用来拿人家开涮

这位兄台,不要搞人身攻击好不好?你以为你这样就能给他教会了?
你这只是给了他一顿饭!精神固然可嘉,但是他能不能消化,尚未可知。
而我是给了他一条觅食的道!虽然这条道不一定对他有用,但是这立意首先就要比你高!

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
8 [报告]
发表于 2003-03-02 16:35 |只看该作者

求教:使用 fork() 的方法

呵呵,说实在的,这是技术版,不是文字版。犯不上和你玩文字游戏。

不论引导的方法对错。人身攻击实在没必要。

论坛徽章:
0
9 [报告]
发表于 2003-03-02 16:48 |只看该作者

求教:使用 fork() 的方法

只怪我学艺不精罢了 =) 多谢 asky78。也谢谢 flw 和 gadfly.

论坛徽章:
0
10 [报告]
发表于 2003-03-02 17:12 |只看该作者

求教:使用 fork() 的方法

原帖由 "flw" 发表:

你这只是给了他一顿饭!精神固然可嘉,但是他能不能消化,尚未可知。
....
..我是给了他一条觅食的道!虽然这条道不一定对他有用,但是这立意首先就要比你高!




饿着肚子还赶什么路?燕窝参汤可以慢用,小米饭就不能消化了?

只是顺着风向敲几个字,干吗这么认真,你一米九几?



----------------
多程序间共享内存的例子程序的部分代码:  
1.Server端程序  
# define SEGSIZE 1024  
# define READTIME 1  
union semun {  
int val;  
struct semid_ds* buf;  
ushort_t* array;  
} ;  
//生成信号量  
int sem(key_t key){  
union semun sem ;  
int semid;  
sem.val=0;  
semid=semget(key,1,IPC_CREAT|0666);  
if (semid ==- 1){  
printf(" create semaphore error\n" );  
exit(- 1);  
}  
//初始化信号量  
semctl(semid,0,SETVAL,sem);  
return semid;  
}  
//删除信号量  
void d_sem(int semid){  
union semun sem ;  
sem.val=0;  
semctl(semid,0,IPC_RMID,0);  
}  
int p(int semid){  
struct sembuf sops={0,+ 1,IPC_NOWAIT};  
return(semop(semid,& sops,1));  
}  
int v(int semid){  
struct sembuf sops={0,- 1,IPC_NOWAIT};  
return(semop(semid,& sops,1));  
}  
int main(){  
key_t key;  
int shmid,semid;  
char* shm;  
char msg[7]=" data " ;  
char i;  
struct shmid_ds buf;  
key=ftok(" /" , 0);  
shmid=shmget(key,SEGSIZE,IPC_CREAT|0604);  
if(shmid ==- 1){  
printf(" create shared momery error\n" );  
return- 1;  
}  
shm=(char* )shmat(shmid,0,0);  
if((int)shm ==- 1){  
printf(" attach shared momery error\n" );  
return- 1;  
}  
semid=sem(key);  
for(i=0;i<=3;i++ ){  
sleep(1);  
p(semid);  
sleep(READTIME);  
msg[5]=' 0'+ i;  
memcpy(shm,msg,sizeof(msg));  
sleep(5;  
v(semid);  
}  
shmdt(shm);  
shmctl(shmid,IPC_RMID,& buf);  
d_sem(semid);  
return 0;  
}  
2.Client端程序# define SEGSIZE 1024  
union semun {  
int val;  
struct semid_ds* buf;  
ushort_t* array;  
} ;  
//打印程序执行时间  
void secondpass(){  
static long start=0;  
time_t timer;  
if (start == 0){  
timer=time(NULL);  
start=(long)timer;  
printf(" now start \n" );  
}  
printf(" second:% ld \n" ,(long)(time(NULL))- start);  
}  
int sem(key_t key){  
union semun sem ;  
int semid;  
sem.val=0;  
semid=semget(key,0,0);  
if (semid ==- 1){  
printf(" get semaphore error\n";  
exit(- 1);  
}  
return semid;  
}  
//等待信号量变成 0  
void waitv(int semid){  
struct sembuf sops={0,0,0};  
semop(semid,& sops,1);  
}  
int main(){  
key_t key;  
int shmid,semid;  
char* shm;  
char msg[100];  
int i;  
key=ftok(" /" , 0);  
shmid=shmget(key,SEGSIZE,0);  
if(shmid ==- 1){  
printf(" get shared momery error\n" );  
return- 1;  
}  
shm=(char* )shmat(shmid,0,0);  
if((int)shm ==- 1){  
printf(" attach shared momery error\n" );  
return- 1;  
}  
semid=sem(key);  
for(i=0;i< 3;i++ ){  
sleep(2);  
waitv(semid);  
printf(" the msg get is \n% s\n" ,shm+ 1);  
secondpass();  
}  
shmdt(shm);  
return 0;  
}  
本程序在 Solaris 7下编译通过。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP