【问题标题】:Synchronization in C with system calls在 C 中与系统调用同步
【发布时间】:2023-04-07 15:02:02
【问题描述】:

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

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

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

我的名字是 syntax_Error 我是 17 岁 旧的\n

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

干杯!=)

【问题讨论】:

  • 这将在哪个操作系统下运行?
  • C 通常在看到换行符之前不会刷新其输出缓冲区。我不太确定这与同步/锁定有什么关系...

标签: c synchronization system-calls locks


【解决方案1】:

如果您正在考虑 C 中的线程和互斥(同步),请查看 POSIX 线程。 (man 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

除了使用'system',还要看'execve'等'man execve'

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 是的。可能令人困惑的是,如果第一个 printf 有一个,它会在 \n 上刷新。
    • 我也打算这样写,但我认为这不会阻止第二个 printf 走在 system 调用的输出上。这确实需要从更高的(设计)角度来解决。
    • @Ben:C 库在程序退出时刷新所有输出,因此在第二个 printf 之前,回显将被刷新到标准输出。
    • @Zan:问题出在第一个printf,而不是echosystem 调用的东西的执行是同步的——最初的提问者完全误解了问题所在。
    • @Ben @T.E.D:我想我的意思是回复@T.E.D,而不是@Ben。
    【解决方案3】:

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

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

    【讨论】:

    • 两个系统调用也可能是不可预测的,因为一个比另一个快!做文件的成本很高,所以这将是我最糟糕的情况
    • @Syntax_Error - 如果你的意思是速度方面,它并不比写入屏幕慢很多。在许多情况下更快。
    猜你喜欢
    • 2016-02-09
    • 1970-01-01
    • 2021-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多