linux system popen,讨论popen、system的实现、问题及解决思路

int ExeCmdByPopen(char *pCmd, char *pBuf, unsighed int len)

{

int count = 2000; /*最多读取2000行*/

FILE *fp = NULL;

char szRead[1024] = {0};

char *pTmp = NULL;

unsighed int nLen = 0;

int status = 0;

pid_t pid;

if(NULL == pCmd || 0 == len)

{

return XERROR;

}

fp = my_popen(pCmd, "r", &pid);//通过一个脚本中转,在脚本中关闭所有的文件描述符,exec fd

if(NULL == fp)

{

perror("XOS_ExeCmdByPopen:popen() failed");

return XERROR;

}

sleep(1);

if(NULL != pBuf)

{

pBuf[0] = '\0';

pTmp = pBuf;

while(count > 0 && NULL != fgets(pTmp, len, fp))

{

nLen = strlen(pTmp);

if(0 == nLen)/*缓存区不够*/

{

break;

}

pTmp += nLen;

len -= nLen;

count--;

}

}

else

{

/*防止脚本在执行的时候可能需要进行写操作,但这边父进程函数退出了,导致管道破坏*/

szRead[0] = '\0';

while(count > 0 && NULL != fgets(szRead, sizeof(szRead)-1, fp))

{

count--;

}

}

/* 下面 close和waitpid组合 相当于pclose.

-- 为了解决XOS_Popen与pclose搭配会产生僵尸进程的问题 */

close(fileno(fp));

while(waitpid(pid, &status, 0) < 0)

{

if(errno != EINTR)

{

status = -1;

break;

}

}

return status;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值