亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
查看: 2765 | 回復(fù): 3
打印 上一主題 下一主題

使用信號進(jìn)行父子進(jìn)程同步,對結(jié)果重定向后出錯(cuò)?险埜呤纸獯 [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2011-12-07 15:39 |只看該作者 |倒序?yàn)g覽
20可用積分
本帖最后由 j3kljs02398j 于 2011-12-07 15:41 編輯

問題描述:
使用信號對兩個(gè)進(jìn)程進(jìn)行同步, 正常輸出,結(jié)果沒有問題,但是對輸出進(jìn)行重定向后,結(jié)果就錯(cuò)了。

正常輸出:
  1. $: ./tellwait
  2. parent        :  1
  3. child        :  2
  4. parent        :  3
  5. child        :  4
  6. parent        :  5
  7. child        :  6
  8. parent        :  7
  9. child        :  8
  10. parent        :  9
  11. child        : 10
  12. #正常結(jié)果應(yīng)該是父子進(jìn)程交替對一共享變量加1
復(fù)制代碼
對結(jié)果進(jìn)行重定向:
  1. $: /tellwait > tellwait.txt
  2. $:  cat tellwait.txt
  3. child        :  2
  4. child        :  4
  5. child        :  6
  6. child        :  8
  7. child        : 10
  8. parent        :  1
  9. parent        :  3
  10. parent        :  5
  11. parent        :  7
  12. parent        :  9
  13. #重定向后,輸出不是交替進(jìn)行了,why?
復(fù)制代碼
源代碼:
  1. /*
  2. * =====================================================================================
  3. *
  4. *       Filename:  tellwait.c
  5. *
  6. *    Description:  使用信號進(jìn)行多個(gè)進(jìn)程同步
  7. *                父子進(jìn)程交叉對共享變量加一,輸出結(jié)果
  8. *
  9. *        Version:  1.0
  10. *        Created:  2011年12月06日 10時(shí)48分41秒
  11. *       Compiler:  gcc
  12. *       Platform:  Linux .6.32-35-generic i686 GNU/Linux
  13. *
  14. * =====================================================================================
  15. */
  16. #include <assert.h>
  17. #include <stdio.h>
  18. #include <unistd.h>
  19. #include <signal.h>
  20. #include <sys/mman.h>
  21. #include <sys/wait.h>

  22. #define NUM (5 * 2)

  23. void
  24. sig_usr(int signo)
  25. {
  26.         if (signo == SIGUSR1 || signo == SIGUSR2)
  27.                 ;
  28. }

  29. int main(void)
  30. {
  31.         int *shared_p;
  32.         pid_t pid;
  33.         int i;
  34.         struct sigaction act1;
  35.         struct sigaction act2;

  36.         /* 捕獲SIGUSR1,SIGUSR2 */
  37.         act1.sa_handler = sig_usr;
  38.         sigfillset(&act1.sa_mask);
  39.         act1.sa_flags = 0;

  40.         act2.sa_handler = sig_usr;
  41.         sigemptyset(&act2.sa_mask);
  42.         act2.sa_flags = 0;

  43.         sigaction(SIGUSR1, &act1, NULL);
  44.         sigaction(SIGUSR2, &act2, NULL);

  45.         /* 共享一個(gè)一塊數(shù)據(jù),供父子進(jìn)程讀寫 */
  46.         shared_p = (int *) mmap(NULL, sizeof(int), PROT_READ |PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS, -1, 0);
  47.         assert(shared_p != NULL);
  48.         *shared_p = 0;

  49.         pid = fork();
  50.         if (pid < 0) {
  51.                 perror("fork");
  52.                 return -1;
  53.         }
  54.         else if (pid == 0) {
  55.                 sigset_t set2, old;
  56.                 /* 子進(jìn)程收到SIGUSR2信號時(shí)對共享變量操作 */
  57.                 sigemptyset(&set2);
  58.                 sigaddset(&set2, SIGUSR2);
  59.                 sigprocmask(SIG_BLOCK, &set2, &old);
  60.                 sigdelset(&old, SIGUSR2);

  61.                 for (i = 0; i < NUM / 2; ++i) {/* 簡單加1 */
  62.                         sigsuspend(&old);
  63.                         (*shared_p)++;
  64.                         printf("child\t: %2d\n", *shared_p);
  65.                         kill(getppid(), SIGUSR1);
  66.                 }
  67.         }
  68.         else {
  69.                 sigset_t set1, old;

  70.                 /* 父進(jìn)程收到SIGUSR1信號時(shí)對共享變量操作 */
  71.                 sigemptyset(&set1);
  72.                 sigaddset(&set1, SIGUSR1);
  73.                 sigprocmask(SIG_BLOCK, &set1, &old);
  74.                 sigdelset(&old, SIGUSR1);
  75.                 for (i = 0; i < NUM / 2; ++i) {/* 簡單加1 */
  76.                         (*shared_p)++;
  77.                         printf("parent\t: %2d\n", *shared_p);
  78.                         kill(pid, SIGUSR2);
  79.                         sigsuspend(&old);
  80.                 }
  81.                 wait(NULL);
  82.                 munmap(shared_p, sizeof (int));
  83.         }       
  84.         return 0;
  85. }
復(fù)制代碼

最佳答案

查看完整內(nèi)容

沒有重定向的時(shí)候,默認(rèn)輸出到標(biāo)準(zhǔn)輸出,是行緩沖的。重定向后,變成了全緩沖?梢栽诿看蝡rintf后面刷新緩沖區(qū),或者改用write。

論壇徽章:
0
2 [報(bào)告]
發(fā)表于 2011-12-07 15:39 |只看該作者
沒有重定向的時(shí)候,默認(rèn)輸出到標(biāo)準(zhǔn)輸出,是行緩沖的。重定向后,變成了全緩沖?梢栽诿看蝡rintf后面刷新緩沖區(qū),或者改用write。

論壇徽章:
0
3 [報(bào)告]
發(fā)表于 2011-12-08 18:05 |只看該作者
沒有重定向的時(shí)候,默認(rèn)輸出到標(biāo)準(zhǔn)輸出,是行緩沖的。重定向后,變成了全緩沖?梢栽诿看蝡rintf后面刷新緩沖區(qū),或者改用write。

論壇徽章:
0
4 [報(bào)告]
發(fā)表于 2011-12-10 14:30 |只看該作者
確實(shí)如此。非常感謝!
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP