URN Logo
UNIX Resources » Linux » China Linux Forum » C/C++编程版 » 37 » 信号处理函数对 popen() 的影响
announcement 声明: 本页内容为中国Linux论坛的内容镜像,文章的版权以及其他所有的相关权利属于中国Linux论坛和相应文章的作者,如果转载,请注明文章来源及相关版权信息。
Resources
China Linux Forum(finished)
Linux Forum(finished)
FreeBSD China(finished)
linuxforum.net
  业界新闻与评论
  自由软件杂谈
  IT 人生
  Linux软件快递
  翻译作坊
  Linux图书与评论
  GNU Emacs/XEmacs
  Linux 中文环境和中文化
  Linux桌面与办公软件
  Linux 多媒体与娱乐版
  自由之窗Mozilla
  笔记本电脑上的Linux
  Gentoo
  Debian 一族
  网络管理技术
  Linux 安装与入门
  WEB服务器和FTP服务器
  域名服务器和邮件服务器
  Linux防火墙和代理服务器应用
  文件及打印服务器
  技术培训与认证
  Linux内核技术
  Linux 嵌入技术
  Linux设备驱动程序
  Linux 集群技术
  LINUX平台数据库
  系统和网络安全
  CPU 与 编译器
  系统计算研究所专栏
  Linux下的GUI软件开发
  C/C++编程版
  PHP 技 术
  Java&jsp技术
  Shell编程技术
  Perl 编 程
  Python 编 程
  XML/Web Service 技术
  永远的Unix
  FreeBSD世界
   
信号处理函数对 popen() 的影响
信号处理函数对 popen() 的影响 - gogoliu [2005-02-28 14:41 | 2,104 byte(s)]
 
Re: 信号处理函数对 popen() 的影响 - alula [2005-02-28 15:12 | 77 byte(s)]
 
Re: 信号处理函数对 popen() 的影响 - gogoliu [2005-02-28 15:58 | 884 byte(s)]
 
Re: 信号处理函数对 popen() 的影响 - gogoliu [2005-03-01 09:04 | 169 byte(s)]
 
Re: 信号处理函数对 popen() 的影响 - alula [2005-02-28 17:13 | 453 byte(s)]
 
Re: 信号处理函数对 popen() 的影响 - alula [2005-02-28 15:00 | 457 byte(s)]
 
Subject: 信号处理函数对 popen() 的影响
Author: gogoliu    Posted: 2005-02-28 14:41    Length: 2,104 byte(s)
[Original] [Print] [Top]
下面的2个程序,echo.c循环的从标准输入读取一行字符串,写入echo.txt文件,popen.c用popen(
)
打开echo的标准输入,每秒向其写入一行字符串。
当popen.c顺利执行的话,cat echo.txt可以看到文件有内容;但是用ctrl +
c中断popen程序的话,
无论在信号处理函数中是否向管道写入内容,或者用pcolse关闭管道,cat
echo.txt不会有内容。
能不能在有中断信号的情况下也能让子进程正确写入数据到echo.txt。

======== popen.c ========
// compile: c99 -Wall -ggdb -o popen popen.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>

FILE *write_fd;

static void
term_exit (int sig_num)
{
printf ("get signal ");
fprintf (write_fd, "get signal ");
pclose (write_fd);
exit (0);
}

int
main ()
{
signal (SIGINT, term_exit);

write_fd = popen ("./echo", "w");

for (int i = 0; i < 10; i++)
{
fprintf (write_fd, "line %i ", i);
sleep (1);
}
fprintf (write_fd, "the end ");
pclose (write_fd);

return 0;
}

======== echo.c ========
// compile: c99 -Wall -ggdb -o echo echo.c
#include <stdio.h>

#define BUF_LEN 256

int
main (int argc, char *argv[])
{
char buffer[BUF_LEN];
FILE *fd;

fd = fopen ("echo.txt", "w");

while (fgets (buffer, BUF_LEN, stdin))
{
fputs (buffer, fd);
}
fputs ("echo say: byebye ", fd);

fclose (fd);
return 0;
}

[Original] [Print] [Top]
Subject: Re: 信号处理函数对 popen() 的影响
Author: alula    Posted: 2005-02-28 15:00    Length: 457 byte(s)
[Original] [Print] [Top]
man popen
...
Note that output popen streams are fully buffered by default
...

加个fflush 也许可以。

static void
term_exit (int sig_num)
{
printf ("get signal ");
fprintf (write_fd, "get signal ");

fflush(write_fd); /// ///////// <-
pclose (write_fd);
exit (0);

}
----
温故知新
[Original] [Print] [Top]
Subject: Re: 信号处理函数对 popen() 的影响
Author: alula    Posted: 2005-02-28 15:12    Length: 77 byte(s)
[Original] [Print] [Top]
在 echo.c中需要增加 SIGINT 处理。

signal(SIGINT, SIG_IGN);
----
温故知新
[Original] [Print] [Top]
Subject: Re: 信号处理函数对 popen() 的影响
Author: gogoliu    Posted: 2005-02-28 15:58    Length: 884 byte(s)
[Original] [Print] [Top]
要是echo进程忽略该信号,则可以完成所需要求,是否使用fflush()都无所谓。
要是echo进程使用自己的信号处理函数,则信号会“破坏”管道,致使echo进程退出循环,
然后结束执行,popen进程因为接收到SIG_PIPE信号而退出。
要是在popen进程中使用fflush()的话,则信号到达echo进程之前的数据都会送达echo进程
然后写进echo.txt文件,因为信号到达后管道被破坏了,所以进程退出。
要是popen进程中没使用fflush()的话,则由于管道的缓存功能,致使信号到达前的数据都
没有送达echo进程处理,所以那些数据没有被写进echo.txt文件,信号到达后管道被破坏了,
所以没有popen的数据被写echo.txt。
要是popen使用fflush(),则在管道被破坏后fflush()时接收到SIG_PIPE信号,不使用fflush()
则到pcolse()时才接收到该信号。

要是使用kill向popen进程发送信号,则echo进程无影响,按ctrl+c echo进程接受到信号,
这应该是终端/bash处理的问题吧。
[Original] [Print] [Top]
Subject: Re: 信号处理函数对 popen() 的影响
Author: alula    Posted: 2005-02-28 17:13    Length: 453 byte(s)
[Original] [Print] [Top]
CTRL-C 会将 SIGINT信号发送给前台进程组的所有进程。关于那个进程接收到此信号的先后,说不清楚,好像是不确定的。
确实是不需要fflush,pclose会flush被缓存的数据。

>>>要是echo进程使用自己的信号处理函数,则信号会“破坏”管道,致使echo进程退出循环,
父进程发生SIG_PIPE 是因为父进程在子进程已经close 了stdin之后,还写此管道。
echo进程退出循环与是否使用了自己的信号处理函数是没有关系的。
----
温故知新
[Original] [Print] [Top]
Subject: Re: 信号处理函数对 popen() 的影响
Author: gogoliu    Posted: 2005-03-01 09:04    Length: 169 byte(s)
[Original] [Print] [Top]
更正一下,“破坏管道”这个说法是错误的,使用自定义的信号处理函数导致echo进程关闭管道和退出
的原因是fgets()调用被中断,返回NULL,跟着echo进程自行关闭管道并退出。
[Original] [Print] [Top]
« Previous thread
有没有测试内核性能的源代码?
C/C++编程版
37
Next thread »
在C给程序中给全局变量指定地址
     

Copyright © 2007 UNIX Resources Network, All Rights Reserved.      About URN | Privacy & Legal | Help | Contact us
备案序号: 京ICP备05006143    webmaster: webmaster@unixresources.net
This page created on 2008-07-17 03:53:09, cost 0.042449951171875 ms.