[新手报道]:Linux下怎么用printf无法将信息打印出来?

jessiepan 2008-06-18 08:48:21
先简单介绍一下我使用的平台: ARM9,Arm-Linux-kernel 2.4.19,超级终端(COM1).

printf("FController:adding control client on fd %d\n", client_sockfd);
////////////////////////////////////////////////////////
printf("FFly Record Starting!!\n");
system("ffly record start");
///////////////////////////////////////////////////////

明明知道这段代码已经被执行了,因为ARM已经将录象的文件保存到了SD卡中,但为何超级终端上无法打印出调试信息呢? 这段代码节选自FController.c(有关网络数据的接收及命令解析线程代码). 不会是要将 printf 调试信息打印出来,还要 GCC 带一个特定参数进行编译吧? 还是因为在网络数据接收的线程里,没办法打印出信息??

小弟,刚接触嵌入Linux编程,对ARM-LINUX下的程序调试很陌生! 这个问题已经困绕我好几天了.
请各位前辈帮帮忙啊!thanks.
...全文
3177 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
跟随内心 2011-08-20
  • 打赏
  • 举报
回复
可不可以把那些具有重定向的代码给屏蔽掉呀~~直接不让重定向生效
HEXVIEW 2009-12-30
  • 打赏
  • 举报
回复
谢谢3楼的
jilily 2009-07-14
  • 打赏
  • 举报
回复
楼主的重定向code,怎么跟我们用的一样的?难不成一个公司的?
fuqd273 2008-06-24
  • 打赏
  • 举报
回复
16楼正解。

自己写一个log输出函数,用自己保留的文件id来进行标准输出。
偶像罗斯福 2008-06-24
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 悠悠长风 的回复:]
1,看看是否重定向了;
2,输出是有缓冲的,加一个换行符\n看看。
[/Quote]
fierygnu 2008-06-23
  • 打赏
  • 举报
回复
你没有说清楚你的打印代码和do_cgi是什么关系。

可以在程序开头复制STDOUT_FILENO,写一个自己的输出函数,函数内用write来输出到复制的描述符去。
jessiepan 2008-06-23
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 chinaproud 的回复:]
引用 3 楼 zdhsoft 的回复:
你要加一个\n,就可以显示出来了。



同意。应该是这个原因
[/Quote]

这个地方我已经Check过了,不是这个原因! 谢谢.

原因大概已经找到,可能是在mini_httpd.c里调用了dup2()函数,进行了输出重定向所造成的. 有没有哪位高手对这方面比较熟的? 帮帮忙啊!
e20080520 2008-06-23
  • 打赏
  • 举报
回复
我突然想起一个问题:可能是你打印的时候被覆盖就看不到了。这样吧,在你想看打印内容之前,你先运行 clear 一下
e20080520 2008-06-23
  • 打赏
  • 举报
回复
我突然想起一个问题:可能是你打印的时候被覆盖就看不到了。这样吧,在你想看打印内容之前,你先运行 clear 一下
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 zdhsoft 的回复:]
你要加一个\n,就可以显示出来了。
[/Quote]


同意。应该是这个原因
威廉-丁 2008-06-21
  • 打赏
  • 举报
回复
我对整个Arm-Linux端软件系统的理解,当FController线程调用select()函数后该线程被系统挂起,等待接收PC端软件发过来的TCP数据包并进行命令的解析;而mini_httpd.c实现的Web-Server跑起来,当IE里有执行图象页面的浏览操作后,CGI里将执行dup2()函数对STDOUT_FILENO的标准输出进行重定向,以便在IE里输出相关的操作提示信息.
不知,我的理解正确否?请大虾过来指点一下.

我现在很想知道,如果我要把超级终端里的打印信息恢复(不需要在IE里输出信息),该如何修改mini_httpd.c里的有关代码呢?
请高手过来看看!谢谢啊


顶一下.
jessiepan 2008-06-21
  • 打赏
  • 举报
回复
我对整个Arm-Linux端软件系统的理解,当FController线程调用select()函数后该线程被系统挂起,等待接收PC端软件发过来的TCP数据包并进行命令的解析;而mini_httpd.c实现的Web-Server跑起来,当IE里有执行图象页面的浏览操作后,CGI里将执行dup2()函数对STDOUT_FILENO的标准输出进行重定向,以便在IE里输出相关的操作提示信息.
不知,我的理解正确否?请大虾过来指点一下.

我现在很想知道,如果我要把超级终端里的打印信息恢复(不需要在IE里输出信息),该如何修改mini_httpd.c里的有关代码呢?
请高手过来看看!谢谢啊
jessiepan 2008-06-20
  • 打赏
  • 举报
回复
从昨天一直到今天都在折腾这个东西,终于发现问题了!是有输出重定向. 在mini_httpd.c里调用了dup2()函数,这个程序主要是用来实现 Web-Server ,完成PC端IE浏览器和Arm 端Linux通信的.

贴出部分代码如下:
static void
do_cgi( void )
{
char** argp;
char** envp;
int parse_headers;
char* binary;
char* directory;

if ( method != METHOD_GET && method != METHOD_POST )
send_error( 501, "Not Implemented", "", "That method is not implemented for CGI." );

if ( conn_fd == STDIN_FILENO || conn_fd == STDOUT_FILENO || conn_fd == STDERR_FILENO )
{
int newfd = dup2( conn_fd, STDERR_FILENO + 1 );
if ( newfd >= 0 )
conn_fd = newfd;

/* Make the environment vector. */
envp = make_envp();

/* Make the argument vector. */
argp = make_argp();

#ifdef USE_SSL
if ( ( method == METHOD_POST && request_len > request_idx ) || do_ssl )
#else /* USE_SSL */
if ( ( method == METHOD_POST && request_len > request_idx ) )
#endif /* USE_SSL */
{
int p[2];
int r;

if ( pipe( p ) < 0 )
send_error( 500, "Internal Error", "", "Something unexpected went wrong making a pipe." );
r = fork();
if ( r < 0 )
send_error( 500, "Internal Error", "", "Something unexpected went wrong forking an interposer." );
if ( r == 0 )
{
/* Interposer process. */
(void) close( p[0] );
cgi_interpose_input( p[1] );
exit( 0 );
}
(void) close( p[1] );
if ( p[0] != STDIN_FILENO )
{
(void) dup2( p[0], STDIN_FILENO );
(void) close( p[0] );
}
}
else
{
/* Otherwise, the request socket is stdin. */
if ( conn_fd != STDIN_FILENO )
(void) dup2( conn_fd, STDIN_FILENO );
}

/* Set up stdout/stderr. For SSL, or if we're doing CGI header parsing,
** we need an output interposer too.
*/
if ( strncmp( argp[0], "nph-", 4 ) == 0 )
parse_headers = 0;
else
parse_headers = 1;
#ifdef USE_SSL
if ( parse_headers || do_ssl )
#else /* USE_SSL */
if ( parse_headers )
#endif /* USE_SSL */
{
int p[2];
int r;

if ( pipe( p ) < 0 )
send_error( 500, "Internal Error", "", "Something unexpected went wrong making a pipe." );
r = fork();
if ( r < 0 )
send_error( 500, "Internal Error", "", "Something unexpected went wrong forking an interposer." );
if ( r == 0 )
{
/* Interposer process. */
(void) close( p[1] );
cgi_interpose_output( p[0], parse_headers );
exit( 0 );
}
(void) close( p[0] );
if ( p[1] != STDOUT_FILENO )
(void) dup2( p[1], STDOUT_FILENO );
if ( p[1] != STDERR_FILENO )
(void) dup2( p[1], STDERR_FILENO );
if ( p[1] != STDOUT_FILENO && p[1] != STDERR_FILENO )
(void) close( p[1] );
}
else
{
/* Otherwise, the request socket is stdout/stderr. */
if ( conn_fd != STDOUT_FILENO )
(void) dup2( conn_fd, STDOUT_FILENO );
if ( conn_fd != STDERR_FILENO )
(void) dup2( conn_fd, STDERR_FILENO );
}

哎!看晕了. 我想如果我要把超级终端里的打印信息回复,该如何该代码呢?
他的这段输出重定向,是不是把他的输出信息全部放到IE浏览器中打印输出了??
bshawk 2008-06-19
  • 打赏
  • 举报
回复
输出转向就是你把标准输出(stdout)重定向到了其他文件描述符!
比如你有输出打印的执行程序 test,在命令行执行 ./test > log.txt 那么所有的输出信息都重定向到文件log.txt中了。标准输出就看不到打印了。

具体到编程,看你程序中是不是调用了dup2()函数。比如dup2(fd3, STDOUT_FILENO)就将标准输出重定向到fd3代表的文件中了。而STDOUT_FILENO被关闭掉。所以无法在标准输出看到打印信息。

man dup/dup2 看看吧!
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 cceczjxy 的回复:]
可能是你运行是输出转向了。
[/Quote]
?????????????????
fuqd273 2008-06-19
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 cceczjxy 的回复:]
可能是你运行是输出转向了。
[/Quote]
hefuhua 2008-06-19
  • 打赏
  • 举报
回复
楼主的程序是以后台运行吗?
e20080520 2008-06-19
  • 打赏
  • 举报
回复
不知道为什么,平时我用的时候都是可以的
过客猫2022 2008-06-19
  • 打赏
  • 举报
回复
你要加一个\n,就可以显示出来了。
悠悠长风 2008-06-19
  • 打赏
  • 举报
回复
1,看看是否重定向了;
2,输出是有缓冲的,加一个换行符\n看看。
加载更多回复(3)

23,125

社区成员

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

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