小编kmk*_*lan的帖子

`write(2)`对本地文件系统的原子性

显然POSIX说明了这一点

文件描述符或流在其引用的打开文件描述上称为"句柄"; 打开的文件描述可能有几个句柄.[...]应用程序影响第一个句柄上文件偏移量的所有活动都应暂停,直到它再次成为活动文件句柄.[...]句柄不需要在同一过程中应用这些规则.- POSIX.1-2008

如果两个线程分别调用[write()函数],则每个调用应该看到另一个调用的所有指定效果,或者没有看到它们.- POSIX.1-2008

我对此的理解是,当第一个进程发出 write(handle, data1, size1)第二个进程并且第二个进程发出时 write(handle, data2, size2),写入可以以任何顺序发生,但是data1并且data2 必须既是原始的又是连续的.

但运行以下代码会给我带来意想不到的结果.

#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/wait.h>
die(char *s)
{
  perror(s);
  abort();
}

main()
{
  unsigned char buffer[3];
  char *filename = "/tmp/atomic-write.log";
  int fd, i, j;
  pid_t pid;
  unlink(filename);
  /* XXX Adding O_APPEND to the flags cures it. Why? */
  fd = open(filename, O_CREAT|O_WRONLY/*|O_APPEND*/, 0644);
  if (fd < 0)
    die("open failed"); …
Run Code Online (Sandbox Code Playgroud)

c file-io posix multiprocessing

17
推荐指数
4
解决办法
5175
查看次数

Go中的静态初始化?

我目前正在研究Go Lang教程,但遇到了其中一个练习的问题:

https://tour.golang.org/methods/23

练习让我实现了一个ROT13密码.我决定使用从字节到旋转值的映射来实现密码,但我不确定初始化此映射的最佳方法.我不想使用文字初始化地图,但更喜欢通过循环遍历字母表并在循环内设置(键,值)对来编程.我还希望只能从Rot13Reader结构/对象访问该地图,并让所有实例(?)共享相同的地图(而不是每个Rot13Reader一个副本).

这是我目前正在进行的Go计划:

package main

import (
    "io"
    "os"
    "strings"
)

type rot13Reader struct {
    r io.Reader
}

var rot13Map = map[byte]byte{}

func (rotr *rot13Reader) Read(p []byte) (int, error) {
    n, err := rotr.r.Read(p)
    for i := 0; i < n; i++ {
        if sub := rot13Map[p[i]]; sub != byte(0) {
            p[i] = sub
        }
    }
    return n, err
}

func main() {
    func() {
        var uppers = []byte("ABCDEFGHIJKLMNOPQRSTUVWXYZ")
        var lowers = []byte("abcdefghijklmnopqrstuvwxyz")

        var init = func (alphabet …
Run Code Online (Sandbox Code Playgroud)

static initializer go static-initialization

14
推荐指数
2
解决办法
1万
查看次数

带有空字符串的Oracle NVL

我有这个表,其中NULL是NULL值,而不是字符串NULL:

MYCOL
--------
NULL
example
Run Code Online (Sandbox Code Playgroud)

为什么这个查询返回NULL行?

select * from example_so where nvl(mycol, '') = '';
Run Code Online (Sandbox Code Playgroud)

sql oracle null nvl

6
推荐指数
2
解决办法
3万
查看次数

Bresenham线绘图Alogrithm

Bresenham的浮点算法中有些东西让我烦恼.

算法如下:

void line(x0, x1, y0, y1)
{
  int deltax = x1 - x0;
  int deltay = y1 - y0;
  float error = 0;
  float deltaerr = Math.abs((float)deltay / (float)deltax);
  int y = y0

  for(int x=x0;x<=x1;x++)
  {
    SetPixel(x,y)
    error = error + deltaerr
    if (error >= 0.5)
    {
             y = y + 1
             error = error - 1.0
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

假设我们想要绘制Y = 0.6X.所以在x = 0的第一步:错误将设置为0.6,我们将遇到if语句,y将增加.和错误将设置为-0.4.-0.4如何在下一步帮助我们?

所以我的问题是这行代码:

error = error - 1.0
Run Code Online (Sandbox Code Playgroud)

为什么我们应该将错误减少1?我读过因为重新调整我们这样做了!它如何帮助我们?

c c++ algorithm bresenham

0
推荐指数
1
解决办法
568
查看次数