- 论坛徽章:
- 0
|
20可用积分
本帖最后由 j3kljs02398j 于 2011-12-07 15:41 编辑
问题描述:
使用信号对两个进程进行同步, 正常输出,结果没有问题,但是对输出进行重定向后,结果就错了。
正常输出:- $: ./tellwait
- parent : 1
- child : 2
- parent : 3
- child : 4
- parent : 5
- child : 6
- parent : 7
- child : 8
- parent : 9
- child : 10
- #正常结果应该是父子进程交替对一共享变量加1
复制代码 对结果进行重定向:- $: /tellwait > tellwait.txt
- $: cat tellwait.txt
- child : 2
- child : 4
- child : 6
- child : 8
- child : 10
- parent : 1
- parent : 3
- parent : 5
- parent : 7
- parent : 9
- #重定向后,输出不是交替进行了,why?
复制代码 源代码:- /*
- * =====================================================================================
- *
- * Filename: tellwait.c
- *
- * Description: 使用信号进行多个进程同步
- * 父子进程交叉对共享变量加一,输出结果
- *
- * Version: 1.0
- * Created: 2011年12月06日 10时48分41秒
- * Compiler: gcc
- * Platform: Linux .6.32-35-generic i686 GNU/Linux
- *
- * =====================================================================================
- */
- #include <assert.h>
- #include <stdio.h>
- #include <unistd.h>
- #include <signal.h>
- #include <sys/mman.h>
- #include <sys/wait.h>
- #define NUM (5 * 2)
- void
- sig_usr(int signo)
- {
- if (signo == SIGUSR1 || signo == SIGUSR2)
- ;
- }
- int main(void)
- {
- int *shared_p;
- pid_t pid;
- int i;
- struct sigaction act1;
- struct sigaction act2;
- /* 捕获SIGUSR1,SIGUSR2 */
- act1.sa_handler = sig_usr;
- sigfillset(&act1.sa_mask);
- act1.sa_flags = 0;
- act2.sa_handler = sig_usr;
- sigemptyset(&act2.sa_mask);
- act2.sa_flags = 0;
- sigaction(SIGUSR1, &act1, NULL);
- sigaction(SIGUSR2, &act2, NULL);
- /* 共享一个一块数据,供父子进程读写 */
- shared_p = (int *) mmap(NULL, sizeof(int), PROT_READ |PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS, -1, 0);
- assert(shared_p != NULL);
- *shared_p = 0;
- pid = fork();
- if (pid < 0) {
- perror("fork");
- return -1;
- }
- else if (pid == 0) {
- sigset_t set2, old;
- /* 子进程收到SIGUSR2信号时对共享变量操作 */
- sigemptyset(&set2);
- sigaddset(&set2, SIGUSR2);
- sigprocmask(SIG_BLOCK, &set2, &old);
- sigdelset(&old, SIGUSR2);
- for (i = 0; i < NUM / 2; ++i) {/* 简单加1 */
- sigsuspend(&old);
- (*shared_p)++;
- printf("child\t: %2d\n", *shared_p);
- kill(getppid(), SIGUSR1);
- }
- }
- else {
- sigset_t set1, old;
- /* 父进程收到SIGUSR1信号时对共享变量操作 */
- sigemptyset(&set1);
- sigaddset(&set1, SIGUSR1);
- sigprocmask(SIG_BLOCK, &set1, &old);
- sigdelset(&old, SIGUSR1);
- for (i = 0; i < NUM / 2; ++i) {/* 简单加1 */
- (*shared_p)++;
- printf("parent\t: %2d\n", *shared_p);
- kill(pid, SIGUSR2);
- sigsuspend(&old);
- }
- wait(NULL);
- munmap(shared_p, sizeof (int));
- }
- return 0;
- }
复制代码 |
最佳答案
查看完整内容
没有重定向的时候,默认输出到标准输出,是行缓冲的。重定向后,变成了全缓冲。可以在每次printf后面刷新缓冲区,或者改用write。
|