首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >popen("ps -fu $USER“,"r")并没有给出所有原始输出结果限制为81个字符长。

popen("ps -fu $USER“,"r")并没有给出所有原始输出结果限制为81个字符长。
EN

Stack Overflow用户
提问于 2013-10-21 07:56:48
回答 1查看 1K关注 0票数 2

我使用linux,在我的代码中,我有一个简单的fllow,它应该读取ps -fu $USER输出的每一行,它确实读取,但不是所有行都读取,只有一半。

代码语言:javascript
复制
const char* szPs      = "ps -fu $USER";      // The PS command.
bool bSubProcessFound = false;
char szBuf[102400];  //big buffer
FILE* pPsOut = popen(szPs, "r");
  if (pPsOut == NULL) {

     bFailure = true;
     return (0);
  } 
// Go thru all commands.
  std::string sPsLine;

  bool bFound = false;
  int sizeofbug = sizeof(szBuf); //just checking size
  while (fgets(szBuf, sizeof(szBuf), pPsOut) != NULL) {

    LogWrite("befor   process: %s in ps", szBuf);
    // Erase new line at the end of ps string.
    szBuf[strlen(szBuf) - 1] = '\0';
    // Extract command line.
    sPsLine = szBuf;
    printf("after   process: %s in ps", sPsLine.c_str());
  } 

例如,如果我在shell im中运行ps -fu $USER命令,得到:

代码语言:javascript
复制
fooy    28407 28401  0 09:59 ?        00:00:04 java -Dappsubprocessname=catalina_gui -classpath .:/home/fooy/simple_java_server TCPServer
fooy    26256 26242  2 Oct20 pts/13   00:23:57 /usr/bin/java -Xms128m -Xmx512m -Dorg.eclipse.equinox.p2.reconciler.dropins.directory=/usr/share/eclipse/dropins -XX:CompileCommand=exclude,

但是当我运行代码时,我得到:

代码语言:javascript
复制
fooy    28407 28401  0 09:59 ?        00:00:03 java -Dappsubprocessname=catalin
fooy    26256 26242  1 Oct20 pts/13   00:23:20 /usr/bin/java -Xms128m -Xmx512m

为什么它要切断线,它看起来有81个字符的限制?甚至像这样简单的命令:

代码语言:javascript
复制
char* in = NULL;
  size_t len =0;
  FILE * psAux = popen("/bin/ps ax", "r");
  while(getline(&in,&sizeofbug,psAux)!=-1)
  {
      fputs(in,stdout);
  }

输出最大每一行长度为81:

代码语言:javascript
复制
3377 ?        Ss     0:00 httpd -f /home/wwwww02/DevDev/Apache/conf/httpd.conf
 3378 ?        S      0:00 httpd -f /home/wwwww02/DevDev/Apache/conf/httpd.conf
 3380 ?        S      0:00 httpd -f /home/wwwww02/DevDev/Apache/conf/httpd.conf
 3381 ?        S      0:00 httpd -f /home/wwwww02/DevDev/Apache/conf/httpd.conf
 3382 ?        S      0:00 httpd -f /home/wwwww02/DevDev/Apache/conf/httpd.conf
 3383 ?        S      0:00 httpd -f /home/wwwww02/DevDev/Apache/conf/httpd.conf
 3384 ?        S      0:00 httpd -f /home/wwwww02/DevDev/Apache/conf/httpd.conf
 3521 ?        S      0:15 [flush-8:32]
 3616 ?        Ss     0:00 sshd: foo123 [priv]
 3624 ?        S      0:00 sshd: foo123@notty
 3625 ?        Ss     0:00 tcsh -c /usr/libexec/openssh/sftp-server
 3639 ?        S      0:00 /usr/libexec/openssh/sftp-server
 3640 ?        Ss     0:00 tcsh -c /usr/libexec/openssh/sftp-server
 3655 ?        S      0:00 /usr/libexec/openssh/sftp-server
 4150 ?        Sl     0:25 SSSBatchCCC.exe -name ValueTxImporter -ORBInitRef Nam
 4154 ?        S      0:29 [flush-8:48]
 4323 ?        S      0:00 httpd -f /home/wwwww02/DevDev/Apache/conf/httpd.conf
 4515 ?        Ss     0:00 sshd: wwwww02 [priv]
 4526 ?        S      0:00 sshd: wwwww02@notty
 4527 ?        Ss     0:00 tcsh -c /usr/libexec/openssh/sftp-server
 4547 ?        S      0:00 /usr/libexec/openssh/sftp-server
 4657 ?        S      0:01 httpd -f /home/wwwww02/DevDev/Apache/conf/httpd.conf
 4742 ?        Ss     0:00 sshd: foo123 [priv]
 4749 ?        Ss     0:00 sshd: foo123 [priv]
 4754 ?        S      0:00 sshd: foo123@pts/7
 4756 ?        S      0:00 sshd: foo123@notty
 4757 ?        Ss     0:00 tcsh -c /usr/libexec/openssh/sftp-server
 4773 ?        S      0:00 /usr/libexec/openssh/sftp-server
 4782 pts/7    Ss     0:00 -tcsh
 5183 ?        Ss    46:18 /usr/sbin/abrtd
 5228 ?        Ss     2:24 abrt-dump-oops -d /var/spool/abrt -rwx /var/log/messa
 5337 pts/13   S+     0:00 /bin/sh /usr/bin/eclipse
 5338 pts/13   S+     0:00 /usr/lib64/eclipse/eclipse
 5352 pts/13   Sl+    6:37 /usr/bin/java -Xms128m -Xmx512m -Dorg.eclipse.equinox
 5472 ?        S      0:00 httpd -f /home/wwwww02/DevDev/Apache/conf/httpd.conf
 5519 ?        Sl    11:14 libvirtd --daemon
 5864 ?        S      0:01 httpd -f /home/wwwww02/DevDev/Apache/conf/httpd.conf
 6363 ?        S<     0:00 /sbin/udevd -d
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-10-21 16:41:28

减少输出的是ps本身。

来自man ps

如果ps无法确定显示宽度,如当输出被重定向(管道)到文件或其他命令时,则输出宽度未定义。(它可以是80,无限,由变量项决定,等等)

因此,如果执行ps凹槽popen(),则显式地需要告诉ps在打印输出时应该假定有多少“列”。

再次来自man ps

输出修饰符 ..。 --cols n设置屏幕宽度 --列n设置屏幕宽度

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19488971

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档