75279


**実行環境**  
OS Darwin Kernel Version 18.7.0  
CPU intel i5-8500  
コンパイラ gcc (中身はclangみたいです)

[code]

    #include <unistd.h>
    #include <stdio.h>
    #include <limits.h>
    #include <errno.h>
    #include <stdlib.h>
    #include <string.h>
    
    int main()
    {
        char *buf = malloc(UINT_MAX);
        size_t i = INT_MAX;
        int n = write(1, buf, ++i);
    
        printf("%p\n%d\n%s\narg : %zu\nmax : %zd\n", buf, n, strerror(errno), i, SSIZE_MAX);
    }
    
[/code]

出力結果

[code]

    0x101d22000
    -1
    Invalid argument
    arg : 2147483648
    max : 9223372036854775807
    
[/code]

`man 2 write` で表示したマニュアルには以下の様に書いてありましたが、SSIZE_MAXはINT_MAXより大きいようでした

[code]

    If the value of nbyte is greater than {SSIZE_MAX}, the result is implementation-defined.
    
[/code]

どうして正常に出力されないのでしょうか？  
同様のコードでもubuntuでは正常に出力されました  
処理系定義なのでしょうか？


CC BY-SA 4.0
2021-04-14T21:03:30.780
75277
2021-04-15T05:45:40.517
2021-04-15T05:45:40.517
3060
44647
question
c macos
write関数の第三引数にINT_MAX + 1以上を入れると-1がreturnされるのはどうしてですか？


> man 2 writeには以下の様に書いてありましたが

macOS 10.15 のマニュアルにはそのような記述は見つけられませんでした。

カーネルのソースコード(xnu の bsd/kern/sys_generic.c 内 `dofilewrite()`)を見ると、`INT_MAX`
を超えると `EINVAL` となるコードがあります。ですので、macOS においてはこの挙動が期待される動作のようです。


CC BY-SA 4.0
2021-04-15T00:21:26.243
75279
2021-04-15T04:38:43.883
2021-04-15T04:38:43.883
3475
3475
75277
answer