Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 如何在linux中识别屏幕上打印的内容? 我在C++应用程序中使用了一个库,并试图捕获文件中的所有输出。我尝试将stderr重定向到stdout,然后将stdout重定向到如下文件: ./a.out 2>&1 > out.txt_Bash_Shell_Pipe_Stdout_Stderr - Fatal编程技术网

Bash 如何在linux中识别屏幕上打印的内容? 我在C++应用程序中使用了一个库,并试图捕获文件中的所有输出。我尝试将stderr重定向到stdout,然后将stdout重定向到如下文件: ./a.out 2>&1 > out.txt

Bash 如何在linux中识别屏幕上打印的内容? 我在C++应用程序中使用了一个库,并试图捕获文件中的所有输出。我尝试将stderr重定向到stdout,然后将stdout重定向到如下文件: ./a.out 2>&1 > out.txt,bash,shell,pipe,stdout,stderr,Bash,Shell,Pipe,Stdout,Stderr,这捕获了我的应用程序中的几乎所有内容,但控制台上仍有一些与我正在使用的库相关的输出。我的问题是: 除了stdout/stderr还有什么吗?(标准DIN除外) 如果有,我如何在我的案例中识别这些 然后我如何将这些重定向到同一个文件 注:在有人熟悉的情况下,库被调用(这是一个C++驱动的事件驱动的模拟库/语言,主要用于系统/硬件设计)。 < P>必须在任何流之前设置输出文件到流重定向,否则BASH无法检测文件名输出。在您的例子中,您可以看到stderr输出 参见参考手册 解决方案: ./a.

这捕获了我的应用程序中的几乎所有内容,但控制台上仍有一些与我正在使用的库相关的输出。我的问题是:

  • 除了stdout/stderr还有什么吗?(标准DIN除外)
  • 如果有,我如何在我的案例中识别这些
  • 然后我如何将这些重定向到同一个文件

<强>注:在有人熟悉的情况下,库被调用(这是一个C++驱动的事件驱动的模拟库/语言,主要用于系统/硬件设计)。

< P>必须在任何流之前设置输出文件到流重定向,否则BASH无法检测文件名输出。在您的例子中,您可以看到stderr输出

参见参考手册

解决方案:

./a.out >out.txt 2>&1
或者只是:

./a.out &>out.txt

必须在任何流到流重定向之前设置输出文件,否则bash无法检测要输出的文件名。在您的例子中,您可以看到stderr输出

参见参考手册

解决方案:

./a.out >out.txt 2>&1
或者只是:

./a.out &>out.txt

嗯,我想可能发生的是,你的程序正在打印到控制终端。一种可能是让您的程序作为没有控制终端的守护进程运行。我有一个
C
函数,我调用它将我的代码转换成守护进程,这是我从一本书中得到的,我强烈推荐这本书

#define BD_NO_CHDIR 01 /* Don't chdir("/") */
#define BD_NO_CLOSE_FILES 02 /* Don't close all open files */
#define BD_NO_REOPEN_STD_FDS 04 /* Don't reopen stdin, stdout, and
               stderr to /dev/null */
#define BD_NO_UMASK0 010 /* Don't do a umask(0) */
#define BD_MAX_CLOSE 8192 /* Maximum file descriptors to close if
             sysconf(_SC_OPEN_MAX) is indeterminate */


int becomeDaemon(int flags){

  int maxfd, fd, new_stdout;
  switch (fork()) { /* Become background process */
  case -1: return -1;
  case 0: break; /* Child falls through... */
  default: _exit(EXIT_SUCCESS); /* while parent terminates */
  }
  if (setsid() == -1) /* Become leader of new session */
   return -1;
  switch (fork()) { /* Ensure we are not session leader */
  case -1: return -1;
  case 0: break;
  default: _exit(EXIT_SUCCESS);
  }

  if (!(flags & BD_NO_UMASK0))
    umask(0); /* Clear file mode creation mask */
 if (!(flags & BD_NO_CHDIR))
   chdir("/"); /* Change to root directory */
 if (!(flags & BD_NO_CLOSE_FILES)) { /* Close all open files */
   maxfd = sysconf(_SC_OPEN_MAX);
   if (maxfd == -1) /* Limit is indeterminate... */
     maxfd = BD_MAX_CLOSE; /* so take a guess */
   for (fd = 0; fd < maxfd; fd++)
     close(fd);
 }


 if (!(flags & BD_NO_REOPEN_STD_FDS)) {

   /*
     STDIN = 0
     STDOUT = 1
     STDERR = 2
   */

   close(0); /* Reopen standard fd's to /dev/null */
   fd = open("/dev/null", O_RDWR);
   if (fd != 0) /* 'fd' should be 0 */
     return -1;
   if (dup2(0, 1) != 1)
     return -1;
   if (dup2(0, 2) != 2)
     return -1;
  }



 return 0;
}
#定义BD_NO_CHDIR 01/*不CHDIR(“/”)*/
#定义BD_NO_CLOSE_FILES 02/*不关闭所有打开的文件*/
#定义BD_否_重新打开_标准_FDS 04/*不重新打开标准输入、标准输出和
stderr到/dev/null*/
#定义BD_NO_UMASK0 010/*不执行umask(0)*/
#定义BD_MAX_CLOSE 8192/*要关闭的最大文件描述符,如果
sysconf(_SC_OPEN_MAX)是不确定的*/
int becomeDaemon(int标志){
int maxfd,fd,new_stdout;
开关(fork()){/*成为后台进程*/
案例1:返回-1;
案例0:中断;/*孩子跌破*/
默认值:_exit(exit_SUCCESS);/*同时父级终止*/
}
如果(setsid()==-1)/*成为新会话的负责人*/
返回-1;
开关(fork()){/*确保我们不是会话负责人*/
案例1:返回-1;
案例0:断裂;
默认值:退出(退出成功);
}
如果(!(标志和BD_NO_UMASK0))
umask(0);/*清除文件模式创建掩码*/
如果(!(标志和BD_NO_CHDIR))
chdir(“/”;/*更改为根目录*/
如果(!(标志&BD_否关闭文件)){/*关闭所有打开的文件*/
maxfd=sysconf(\u SC\u OPEN\u MAX);
如果(maxfd==-1)/*限制不确定*/
maxfd=BD_MAX_CLOSE;/*所以猜一猜*/
对于(fd=0;fd
现在我假设您可以将行
open(“/dev/null”,O_RDWR)
更改为
open(“/home/you/output.txt”,O_RDWR)
,并将输出重定向到那里。当然,你不能直接从终端输入到你的程序中,但是从你收到的错误消息的声音来看,我认为你无论如何都在使用一个套接字,所以如果有必要的话,你可以编写一个客户端来为你做这件事


希望有帮助。

嗯,我想可能发生的是,您的程序正在打印到控制终端。一种可能是让您的程序作为没有控制终端的守护进程运行。我有一个
C
函数,我调用它将我的代码转换成守护进程,这是我从一本书中得到的,我强烈推荐这本书

#define BD_NO_CHDIR 01 /* Don't chdir("/") */
#define BD_NO_CLOSE_FILES 02 /* Don't close all open files */
#define BD_NO_REOPEN_STD_FDS 04 /* Don't reopen stdin, stdout, and
               stderr to /dev/null */
#define BD_NO_UMASK0 010 /* Don't do a umask(0) */
#define BD_MAX_CLOSE 8192 /* Maximum file descriptors to close if
             sysconf(_SC_OPEN_MAX) is indeterminate */


int becomeDaemon(int flags){

  int maxfd, fd, new_stdout;
  switch (fork()) { /* Become background process */
  case -1: return -1;
  case 0: break; /* Child falls through... */
  default: _exit(EXIT_SUCCESS); /* while parent terminates */
  }
  if (setsid() == -1) /* Become leader of new session */
   return -1;
  switch (fork()) { /* Ensure we are not session leader */
  case -1: return -1;
  case 0: break;
  default: _exit(EXIT_SUCCESS);
  }

  if (!(flags & BD_NO_UMASK0))
    umask(0); /* Clear file mode creation mask */
 if (!(flags & BD_NO_CHDIR))
   chdir("/"); /* Change to root directory */
 if (!(flags & BD_NO_CLOSE_FILES)) { /* Close all open files */
   maxfd = sysconf(_SC_OPEN_MAX);
   if (maxfd == -1) /* Limit is indeterminate... */
     maxfd = BD_MAX_CLOSE; /* so take a guess */
   for (fd = 0; fd < maxfd; fd++)
     close(fd);
 }


 if (!(flags & BD_NO_REOPEN_STD_FDS)) {

   /*
     STDIN = 0
     STDOUT = 1
     STDERR = 2
   */

   close(0); /* Reopen standard fd's to /dev/null */
   fd = open("/dev/null", O_RDWR);
   if (fd != 0) /* 'fd' should be 0 */
     return -1;
   if (dup2(0, 1) != 1)
     return -1;
   if (dup2(0, 2) != 2)
     return -1;
  }



 return 0;
}
#定义BD_NO_CHDIR 01/*不CHDIR(“/”)*/
#定义BD_NO_CLOSE_FILES 02/*不关闭所有打开的文件*/
#定义BD_否_重新打开_标准_FDS 04/*不重新打开标准输入、标准输出和
stderr到/dev/null*/
#定义BD_NO_UMASK0 010/*不执行umask(0)*/
#定义BD_MAX_CLOSE 8192/*要关闭的最大文件描述符,如果
sysconf(_SC_OPEN_MAX)是不确定的*/
int becomeDaemon(int标志){
int maxfd,fd,new_stdout;
开关(fork()){/*成为后台进程*/
案例1:返回-1;
案例0:中断;/*孩子跌破*/
默认值:_exit(exit_SUCCESS);/*同时父级终止*/
}
如果(setsid()==-1)/*成为新会话的负责人*/
返回-1;
开关(fork()){/*确保我们不是会话负责人*/
案例1:返回-1;
案例0:断裂;
默认值:退出(退出成功);
}
如果(!(标志和BD_NO_UMASK0))
umask(0);/*清除文件模式创建掩码*/
如果(!(标志和BD_NO_CHDIR))
chdir(“/”;/*更改为根目录*/
如果(!(标志&BD_否关闭文件)){/*关闭所有打开的文件*/
maxfd=sysconf(\u SC\u OPEN\u MAX);
如果(maxfd==-1)/*限制不确定*/
maxfd=BD_MAX_CLOSE;/*所以猜一猜*/
对于(fd=0;fd
现在我假设您可以将行
open(“/dev/null”,O_RDWR)
更改为
open(“/home/you/output.txt”,O_RDWR)
,并将输出重定向到那里。当然,你不能直接从终端输入到你的程序中,但是从你收到的错误消息的声音来看,我认为你无论如何都在使用一个套接字,所以如果有必要的话,你可以编写一个客户端来为你做这件事


希望这能有所帮助。

hmm,这对我有一定的帮助