gpt4 book ai didi

c - 使用一系列 write() 而不是单个 write()

转载 作者:太空宇宙 更新时间:2023-11-03 23:36:51 28 4
gpt4 key购买 nike

我在 Unix 系统上用 C 编程。我知道:

write(fd,"ABCD",4);

比这样做更好:

write(fd, "A", 1);
write(fd, "B", 1);
write(fd, "C", 1);
write(fd, "D", 1);

显然,我不是谈论代码的易读性,但我想知道第二种方法可能会带来什么问题。我们谈论执行的原子性吗?如果是,为什么?

谢谢

最佳答案

你在这里担心原子性是对的。

如果另一个进程或同一进程中的另一个线程也在写入同一通信 channel ,则

write(fd, "ABCD", 4);

将自动写入四个字节“ABCD”,因为其他写入器的输出不能出现在这四个字节的中间。另一方面,

write(fd, "A", 1);
write(fd, "B", 1);
write(fd, "C", 1);
write(fd, "D", 1);

将分别写入每个字节,其他写入器的输出可以出现在字母之间。

但是,只有 写入才能保证原子性,其中第三个参数小于常量 PIPE_BUF。如果您写入的数据多于此,则无法确保其他写入器的输出不会出现在中间。 PIPE_BUF 可能小到 512,但通常比现在的要大一些。

最简单的方法是使用 fork 并写入标准输出:

#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>

int main(void)
{
pid_t pid = fork();
if (pid < 0) {
perror("fork");
return 1;

} else if (pid == 0) {
// child
write(1, "ABCD", 4); sleep(1);
write(1, "A", 1); sleep(1);
write(1, "B", 1); sleep(1);
write(1, "C", 1); sleep(1);
write(1, "D", 1);
return 0;

} else {
// parent
write(1, "1234", 4); sleep(1);
write(1, "1", 1); sleep(1);
write(1, "2", 1); sleep(1);
write(1, "3", 1); sleep(1);
write(1, "4", 1);

waitpid(pid, 0, 0);
write(1, "\n", 1);
return 0;
}
}

此程序将打印类似 1234ABCD1AB23CD4 的内容。第一个 ABCD 总是作为一个组出现,第一个 1234 也总是作为一个组出现,但任何一个都可以是第一个;第二个 ABCD1234 可能会任意混合在一起。

(小测验:为什么我把最后的 write(1, "\n", 1) 放在父级中, waitpid?)

关于c - 使用一系列 write() 而不是单个 write(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58357098/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com