pthread_atfork()函数使用

编程学习指南 华中科技大学 2013-05-09 03:05:02
看下面一段代码:
#include "apue.h"
#include <pthread.h>

pthread_mutex_t lock1 = PTHREAD_MUTEX_INITIALIZER;
pthread_mutex_t lock2 = PTHREAD_MUTEX_INITIALIZER;

void
prepare(void)
{
printf("preparing locks...\n");
pthread_mutex_lock(&lock1);
pthread_mutex_lock(&lock2);
}

void
parent(void)
{
printf("parent unlocking locks...\n");
pthread_mutex_unlock(&lock1);
pthread_mutex_unlock(&lock2);
}

void
child(void)
{
printf("child unlocking locks...\n");
pthread_mutex_unlock(&lock1);
pthread_mutex_unlock(&lock2);
}

void *
thr_fn(void *arg)
{
printf("thread started...\n");
pause();
return(0);
}

int
main(void)
{
int err;
pid_t pid;
pthread_t tid;

#if defined(BSD) || defined(MACOS)
printf("pthread_atfork is unsupported\n");
#else
if ((err = pthread_atfork(prepare, parent, child)) != 0)
err_exit(err, "can't install fork handlers");
err = pthread_create(&tid, NULL, thr_fn, 0);
if (err != 0)
err_exit(err, "can't create thread");
sleep(2);
printf("parent about to fork...\n");
if ((pid = fork()) < 0)
err_quit("fork failed");
else if (pid == 0) /* child */
printf("child returned from fork\n");
else /* parent */
printf("parent returned from fork\n");
#endif
exit(0);
}


运行结果:


但是如果我将其重定向到一个txt文件,运行完毕之后打开txt文件其内容如下:


为什么会不同呢?求解!
...全文
318 8 点赞 打赏 收藏 举报
写回复
8 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
hhhhhzj 2015-09-26
具体参见UNIX环境高级编程第二版8.3节fork函数 如果标准输出连接到终端设备,则它是行缓冲的,否则它是全缓冲的。当以交互方式运行改程序时,只得到该printf输出的行一次,其原因是标准输出缓冲区由换行符冲洗。当时当标准输出重定向到一个文件时,却得到printf输出行两次。其原因是,在fork之前调用了printf一次,但当调用fork时,改行数据仍在缓冲区中,然后在将父进程数据空间复制到子进程中时,改缓冲区也没复制到子进程中。于是那时父,子进程各自有了带改行内容的标准I/O缓冲区。 总结一下就是,输出到调用printf输出到终端时,输出一行输出缓冲区就会被冲洗。但是输出到文件时,变成了全缓冲,输出一行但是缓冲区并没有被冲洗。此程序是父进程先运行,子进程得到了父进程的数据空间副本,所以父进程调用的printf产生的数据缓冲也复制到了子进程的数据空间,所以调用printf函数就把父进程的数据也打印出来了。
  • 打赏
  • 举报
回复
答案应该是行缓冲变成了全缓冲!
  • 打赏
  • 举报
回复
qq120848369 2013-05-10
引用 2 楼 Lonely_Snow 的回复:
我猜是因为单缓冲重定向到文件时变成了双缓冲的问题,信不信由你
正解了。
  • 打赏
  • 举报
回复
空的 2013-05-10
不好意思发错了。。。。
  • 打赏
  • 举报
回复
空的 2013-05-10

有谁有比这个清晰版的么,最好有个目录导引什么的,求发
  • 打赏
  • 举报
回复
Lonely_Snow 2013-05-09
错了,变成了全缓冲的问题
  • 打赏
  • 举报
回复
Lonely_Snow 2013-05-09
我猜是因为单缓冲重定向到文件时变成了双缓冲的问题,信不信由你
  • 打赏
  • 举报
回复
Carl_CCC 2013-05-09
因为管道的问题,一开始是一个进程,后面分裂成2个进程,直接打印的话,重合部分打印一次,管道的话,就都要打印了。因为前两句分别在两个进程中。
  • 打赏
  • 举报
回复
相关推荐
发帖
Linux/Unix社区
加入

2.1w+

社区成员

Linux/Unix社区 应用程序开发区
申请成为版主
帖子事件
创建了帖子
2013-05-09 03:05
社区公告
暂无公告