免费注册 查看新帖 |

Chinaunix

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

在LInux下怎么样进行父子进程同步呢 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-10-15 11:17 |只看该作者 |倒序浏览
怎么样在父子进程中进行同步控制呢,我想让父进程执行完了,再执行子进程,能不能弄个例子来说明呀,
还有如何与其他的不相干的进程进行同步呢,最好不要用到信号量

论坛徽章:
0
2 [报告]
发表于 2007-10-15 11:46 |只看该作者
不用信号量的话就用fcntl文件锁吧, 不过为什么不用信号量呢?
在<UNIX网络编程>卷二中有关于信号量的详细的实例, 可以看看. 也不是太难.

论坛徽章:
0
3 [报告]
发表于 2007-10-15 12:11 |只看该作者
如果只是规定父子进程的执行顺序的话可以用信号的,子进程在需要同步的地方调用pause,父进程在适当的时候发送一个信号把pause打断

论坛徽章:
0
4 [报告]
发表于 2007-10-15 12:12 |只看该作者

回复 #2 scutan 的帖子

fcntl是文件锁吗,那和同步有什么关系呢,怎么样控制进程的同步呢

论坛徽章:
0
5 [报告]
发表于 2007-10-15 12:13 |只看该作者

回复 #3 cugb_cat 的帖子

能写一个例子吗,不用太复杂,只要能说明问题的部分写出来就可以

论坛徽章:
0
6 [报告]
发表于 2007-10-15 12:14 |只看该作者
apue 英文版2nd  P337 有相关的实现,基于信号的

论坛徽章:
0
7 [报告]
发表于 2007-10-15 12:38 |只看该作者
原帖由 zenglei286 于 2007-10-15 12:13 发表
能写一个例子吗,不用太复杂,只要能说明问题的部分写出来就可以


  1. #include<stdio.h>
  2. #include<fcntl.h>
  3. #include<semaphore.h>
  4. #include<stdlib.h>
  5. #include<unistd.h>
  6. #include<sys/types.h>
  7. #include<sys/mman.h>
  8. int main(int argc, char **argv)
  9. {
  10.         int fd, i, nloop, zero = 0;
  11.         int *ptr;
  12.         sem_t *mutex;

  13.         if (argc != 3)
  14.         {
  15.                 fprintf(stderr, "usage: test <pathname> <#loops>\n");
  16.                 exit(1);
  17.         }
  18.         nloop = atoi(argv[2]);
  19.         if ((fd = open(argv[1], O_RDWR|O_CREAT, 0644)) < 0)
  20.         {
  21.                 fprintf(stderr, "open %s error\n", argv[1]);
  22.                 exit(1);
  23.         }
  24.         if (write(fd, &zero, sizeof(int)) < 0)
  25.         {
  26.                 fprintf(stderr, "write error\n");
  27.                 exit(1);
  28.         }
  29.         ptr = mmap(NULL, sizeof(int), PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);
  30.         if (ptr == NULL)
  31.         {
  32.                 fprintf(stderr, "mman error\n");
  33.                 exit(1);
  34.         }
  35.         close(fd);
  36.         mutex = sem_open("/hello", O_CREAT|O_EXCL, 0644, 1);
  37.         if (mutex == SEM_FAILED)
  38.         {
  39.                 fprintf(stderr, "sem_open fail\n");
  40.                 exit(1);
  41.         }
  42.         sem_unlink("/hello");
  43.         setbuf(stdout, NULL);
  44.         if (fork() == 0)
  45.         {
  46.                 for (i = 0; i < nloop; i++)
  47.                 {
  48.                         sem_wait(mutex);
  49.                         printf("child: %d\n", (*ptr)++);
  50.                         sem_post(mutex);
  51.                 }
  52.                 exit(0);
  53.         }
  54.         for (i = 0; i < nloop; i++)
  55.         {
  56.                 sem_wait(mutex);
  57.                 printf("parent: %d\n", (*ptr)++);
  58.                 sem_post(mutex);
  59.         }
  60.         return 0;
  61. }

复制代码

这是<UNIX网络编程>卷2上的一个父子进程同步的例子. 使用信号量的方法, 比较简单. 你看看吧

用文件锁当然可以了. 你父进程先去把文件锁了, 然后子进程每次运行时去读那个文件, 看是否锁住, 如果锁住则不运行, 如果没锁则将其锁定, 就这样啊.

论坛徽章:
0
8 [报告]
发表于 2007-10-20 21:37 |只看该作者

回复 #3 cugb_cat 的帖子

怎么打断PAuse这个方法呀

论坛徽章:
0
9 [报告]
发表于 2007-10-20 22:55 |只看该作者
进程间的通信方法有很多,pipe,FIFO,消息队列等等,去看看相关的书籍就知道了

论坛徽章:
0
10 [报告]
发表于 2009-12-10 20:02 |只看该作者
那个代码段咋不能运行,莫名其妙,那些头文件我明明是包含的,结果还是报错
flock_syn.c:45: undefined reference to `sem_open'
flock_syn.c:51: undefined reference to `sem_unlink'
flock_syn.c:65: undefined reference to `sem_wait'
flock_syn.c:67: undefined reference to `sem_post'
/flock_syn.c:57: undefined reference to `sem_wait'
flock_syn.c:59: undefined reference to `sem_post'
而我的man显示头文件都包含了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP