0

我正在做一些奇怪的事情,但我希望它完全同步。所以我想请你帮忙。我有以下内容:

printf("My name is:");
system("echo syntax_Error");
printf("I am 17 yrs old\n");

这是相当抽象的,而不是 echo 我正在执行一个给我输出的软件,所以执行时间是不可预测的,但顺序是一样的。我想要一个 printf 然后是系统调用,然后是 printf ,这样它们就可以对齐了

我的名字是 syntax_Error 我 17 岁\n

我在没有锁的情况下尝试了这个命令,但它不起作用,这很明显,或者如果它确实起作用,有时它是不可预测的。我是同步结构的新手,所以我想听听您的意见。

干杯!=)

4

3 回答 3

2

如果您正在考虑 C 中的线程和互斥(同步),那么请查看 POSIX 线程。(人 pthread)。

正如其他人所说,让你的字符串以正确的顺序刷新标准输出。如果您使用的是支持 -n (无换行符)的“echo”操作系统,那么这就是您所追求的。

#include <stdio.h>

int main(int argc, char *argv[]) {

printf("My name is:");
fflush(stdout);
system("/bin/echo -n syntax_Error");
printf("I am 17 yrs old\n");
fflush(stdout);

}

$ cc     main.c   -o main
$ ./main
My name is:syntax_ErrorI am 17 yrs old

不仅仅是使用“系统”,还可以查看“execve”等。“man execve”

于 2011-02-10T15:06:42.140 回答
2

您可能需要fflush(stdout)在第一次printf调用后显式刷新输出缓冲区。该system调用产生了一个具有自己缓冲的新进程。最终该进程终止并刷新其缓冲区,但父进程的缓冲区完全不相关。

值得注意的是,大多数 libc 实现会在每次出现换行符时自动刷新,因此fflush如果您在第一条消息的末尾有换行符,则无需调用。

于 2011-02-10T14:55:31.383 回答
0

如果你想使用同步对象,你必须想办法让那个system调用也使用它们。这可能意味着编写另一个程序而不是使用echo. 有点乱

处理它的更聪明的方法可能是对控制台输出使用所有相同的方法(所有system调用或所有printfs),或者选择其中一个输出到日志文件而不是控制台。

于 2011-02-10T14:57:46.010 回答