AIX上的popen函数大讨论

lanying 2008-06-21 12:01:19
在AIX5.2上测试程序,发现popen一个程序读的时候总是报被信号打断,所以写了个程序进行测试,发现当捕获SIGCHLD信号的时候,确实有这个问题,但在HP11.11和Linux 2.6内核下没有这个问题。
怀疑是主进程执行popen()的时候进行fork(),之后popen()返回,主进程接着read(),而子进程写入标准输出,也可能管道的数据有缓存,直到子进程退出close()的时候才往里写,或者写得太快,主进程还没来得及被唤醒,而子进程一退,发上发SIGCHLD信号给主进程,而主进程还在那儿read()呢,所以read()被中断,报中断错。

#include <stdio.h> /* printf() */
#include <stdlib.h> /* exit() */
#include <unistd.h> /* popen() */
#include <errno.h> /* errno */
#include <string.h> /* strerror() */

static void open_read(char *pname);
static void sig_child(int signo);

int main(int argc, char *argv[])
{
int i;
int ln;

ln = atoi(argv[2]);

signal(SIGCHLD, sig_child);
for(i = 0; i < ln; i++) {
open_read(argv[1]);
}

exit(EXIT_SUCCESS);

return 0;
}

static void open_read(char *pname)
{
int i;
char buf[BUFSIZ];
FILE *fp;
int r;

if ((fp = popen(pname, "r")) == NULL) {
perror("popen");
exit(EXIT_FAILURE);
}
for(i = 0; i < BUFSIZ; i++) {
if ((r = read(fileno(fp), buf, 1)) < 0) {
perror("error read");
exit(1);
} else if (r > 0) {
(void)fprintf(stdout, "read: %s\n", buf);
} else {
(void)fprintf(stdout, "read finished\n");
break;
}
}
if (pclose(fp) < 0) {
perror("pclose");
exit(EXIT_FAILURE);
}
}

static void sig_child(int signo)
{
fprintf(stderr, "receiving signal child\n");
}

...全文
181 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
fierygnu 2008-06-30
  • 打赏
  • 举报
回复
。。。
答非所问,呵呵
lanying 2008-06-29
  • 打赏
  • 举报
回复
问题解决了,AIX上默认不重起被中断的系统调用
lanying 2008-06-29
  • 打赏
  • 举报
回复
to 楼上:
确实忘写了buf初始化成0的语句,不过貌似编译器给初始化成0了。
信号应该是SIGCHLD信号,因为把SIGCHLD信号给屏蔽了就不会报错!
fierygnu 2008-06-25
  • 打赏
  • 举报
回复
用AIX的trace跟一下,看看read是被什么信号打断的。

另外,(void)fprintf(stdout, "read: %s\n", buf);不对,buf不是以\0结尾的字符串,不能用%s输出。
cceczjxy 2008-06-23
  • 打赏
  • 举报
回复
可能是sigaction在aix内的实现的问题。
szkarry 2008-06-23
  • 打赏
  • 举报
回复
LZ 我在arm 上也遇到这个问题
也是在一个循环中用popen 来执行一个系统命令
大约一秒内要循环25左右
大约进行个3-4秒左右板子就重起了
lanying 2008-06-23
  • 打赏
  • 举报
回复
sh的什么问题?莫非sh不用waitpid等待命令结束?
dxing_1983 2008-06-23
  • 打赏
  • 举报
回复
支持你解决
学习
pottichu 2008-06-21
  • 打赏
  • 举报
回复
popen  打开 sh .
sh 再去启动 应用程序,
我倒认为是AIX 上的 sh 的问题.

这个主进程收到SIGCHLD信号,实际上是 sh退出了.
gettext 2008-06-21
  • 打赏
  • 举报
回复
u fread

23,120

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧