当前位置: 技术问答>linux和unix
fgets()报错问题(errno=4)
来源: 互联网 发布时间:2016-02-19
本文导语: 有一个获取进程个数的程序: sprintf(Cmd, "ps -ef|grep %s|grep %s|wc -l", prog, entr); fp = popen(Cmd, "r"); if(fp == NULL) { printf("打开管道[%s]错n", Cmd); return -1; } memset(buff, 0...
有一个获取进程个数的程序:
sprintf(Cmd, "ps -ef|grep %s|grep %s|wc -l", prog, entr);
fp = popen(Cmd, "r");
if(fp == NULL) {
printf("打开管道[%s]错n", Cmd);
return -1;
}
memset(buff, 0, sizeof(buff));
if ( fgets(buff, 256, fp) == NULL ) {
perror( "fgets:" );
printf("fgets() error[%d][%ld]n",i, (long)getpid() );
pclose( fp );
return -1;
}
。。。。。。
pclose(fp);
正常运行是没有问题的。但是如果捕获了SIGCHLD信号后,重复执行以上程序,则会不定时在fgets()
时报错:Interrupted system call(errno==4)。
完整的程序代码如下:
#include
#include
#include
#include
#include
#include
#include
#include
struct sigaction sa_old;
struct sigaction sa_new;
/*------------------------------------------------------------------------
Function Name : agt_chld_exit
Description : 子进程结束信号处理
Input :
_sign 捕捉到的信号
Output :
Return :
------------------------------------------------------------------------*/
void agt_chld_exit(int _sign)
{
int e = errno;
int stat = 0;
pid_t pid_tmp = 0;
while((pid_tmp = waitpid(-1, &stat, WNOHANG)) > 0)
printf("进程[%d]退出n", pid_tmp);
errno = e;
return;
}
int
main()
{
int i=0;
FILE *fp = NULL;
char Cmd[1025];
char buff[1025];
char prog[81];
char entr[9];
int Cnt = 0;
int ret = -1;
memset(&sa_old, 0, sizeof(sa_old));
memset(&sa_new, 0, sizeof(sa_new));
signal(SIGPIPE, SIG_IGN);
if(setpgrp()