我有一个C程序编译成一个名为myprogram的可执行文件.这是它的主要功能:
int main(int argc, char ** argv) {
printf("this is a test message.\n");
system("ls");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
当我myprogram > output.txt在Linux shell中运行然后检查output.txt时,我看到ls上面列出的输出"这是一条测试消息".
我觉得应该是相反的方式.为什么会发生这种情况,我能做些什么,以便"这是一条测试消息"出现在output.txt的顶部?
如果重要的话,我是C的新手并且在命令行中工作.
我正在尝试在网页上运行一个将实时返回其输出的进程.例如,如果我运行'ping'进程,它应该在每次返回一个新行时更新我的页面(现在,当我使用exec(命令,输出)时,我被迫使用-c选项并等待进程完成以查看在我的网页上输出).有可能在PHP中这样做吗?
我也想知道当有人离开页面时,杀死这种过程的正确方法是什么.在"ping"过程中,我仍然可以看到系统监视器中运行的进程(有意义).
我开始用C语言了.我使用eclipse(juno)作为我的IDE并安装了CDT插件.我还解压缩了mingw64(GCC编译器).我写了一个非常简单的程序,看它是否有效.这是我的代码:
#include <stdio.h>
int main()
{
int age;
printf("Hello, please enter your age:\n");
scanf("%d", &age);
printf("Your age is %d", age);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
问题是输出缓冲区填充了第一个字符串的值,printf但不会将其输出到控制台.我必须输入一个数字,然后只有缓冲区将所有数据倒入控制台,所以我看到控制台是这样的:
1
Hello, please enter your age:
Your age is 1
Run Code Online (Sandbox Code Playgroud)
而不是预期的:
Hello, please enter your age:
1
Your age is 1
Run Code Online (Sandbox Code Playgroud)
现在,我发现我可以fflush(stdout)在第一个之后使用,printf但我不认为这个解决方案是优雅的,甚至是必要的.关于如何克服这个问题的任何想法?
编辑 - 因为我在大学里学习这个,我不能使用课程中没有学到的东西,所以我只能使用printf和scanf
新编辑 - 我想我已经找到了解释.正如我所说,我正在输出到Eclipse内的控制台视图.奇怪的是,如果我从Windows的命令行编译并运行程序,我得到想要的结果.因此,我认为eclipse实际上是将输出写入文件并在控制台窗口中显示.如何强制eclipse在我的运行配置中打开一个真正的命令行窗口?
该蟒蛇线程 文档指出"......线程仍然是一个合适的模型,如果你想同时运行多个I/O密集型任务",这显然是因为I/O密集型进程能够避免,防止线程并发执行的GIL CPU绑定任务.
但我不明白的是I/O任务仍然使用CPU.那怎么能不遇到同样的问题呢?是因为I/O绑定任务不需要内存管理吗?
我想关闭stdout的缓冲以获取以下代码的确切结果
while(1) {
printf(".");
sleep(1);
}
Run Code Online (Sandbox Code Playgroud)
代码printf一堆'.' 只有当缓冲区被填满时
行为printf()似乎取决于的位置stdout.
stdout发送到控制台,则printf()行缓冲并在打印换行符后刷新.stdout被重定向到文件,则除非fflush()被调用,否则不刷新缓冲区.printf()在stdout重定向到文件之前使用,则后续写入(对文件)是行缓冲的并在换行后刷新.何时进行stdout行缓冲,什么时候fflush()需要调用?
void RedirectStdout2File(const char* log_path) {
int fd = open(log_path, O_RDWR|O_APPEND|O_CREAT,S_IRWXU|S_IRWXG|S_IRWXO);
dup2(fd,STDOUT_FILENO);
if (fd != STDOUT_FILENO) close(fd);
}
int main_1(int argc, char* argv[]) {
/* Case 1: stdout is line-buffered when run from console */
printf("No redirect; printed immediately\n");
sleep(10);
}
int main_2a(int argc, char* argv[]) {
/* Case 2a: stdout is not line-buffered when …Run Code Online (Sandbox Code Playgroud) c中的printf函数并不总是在屏幕上打印输出.例如,如果您忘记将\n放在字符串的末尾,那么您有时会得不到o/p.printf无法打印时是否还有其他一些条件.我记得有人说有7个这样的条件.你能帮忙吗?
我正在尝试学习libuvapi并编写以下测试:
#include <stdio.h>
#include <stdlib.h>
#include <uv.h>
void timer_cb(uv_timer_t* timer) {
int* i = timer->data;
--*i;
if(*i == 0) {
uv_timer_stop(timer);
}
printf("timer %d\n", *i);
//fflush(stdout);
}
int main() {
uv_loop_t* loop = uv_default_loop();
uv_timer_t* timer = malloc(sizeof(uv_timer_t));
uv_timer_init(loop, timer);
int i = 5;
timer->data = &i;
uv_timer_start(timer, timer_cb, 1000, 2000);
uv_run(loop, UV_RUN_DEFAULT);
printf("Now quitting.\n");
uv_close(timer, 0);
uv_loop_close(loop);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
运行它时,在程序完成运行之前不会显示任何输出,然后立即显示所有输出.如果我取消注释fflush它按预期工作,则每2秒写一次.
有人可以向我解释一下吗?为什么stdout如解释不换行后刷新,在这里和在其他地方?为什么我需要手动冲洗它?
我试图将外部C++函数与我的Rust应用程序链接.此函数有效,但它的执行顺序与从Rust代码调用的顺序不同.
为什么会这样?这记录了吗?
以下是Rust应用程序的列表:
extern crate libc;
use libc::c_int;
#[link(name = "Project1", kind = "static")]
extern "C" {
pub fn lib_fun(i: c_int) -> c_int;
}
fn main() {
unsafe {
lib_fun(2);
}
println!("from Rust: {}", 2);
}
Run Code Online (Sandbox Code Playgroud)
"Project1"库看起来像这样:
#include <stdio.h>
extern "C" {
int lib_fun(int t) {
printf("from C++: %d\n", t);
return t;
}
}
Run Code Online (Sandbox Code Playgroud)
预期产量:
from C++: 2
from Rust: 2
Run Code Online (Sandbox Code Playgroud)
实际输出顺序相反:
from Rust: 2
from C++: 2
Run Code Online (Sandbox Code Playgroud)
外部函数是lib_func在另一个线程中执行的吗?为什么?
细节: