組み込みLinuxの環境でライトプロテクト付きUSBメモリ（バッファロ製、型番不明）について質問があります。  
このメモリは、SWがついており、ライトプロテクトのON/OFFが出来ます。

このメモリをプロテクトONでマウントすると

```

    mount: /dev/sda1 is write-protected, mounting read-only
    
```

とメッセージがデますがマウントできます。  
この状態で、以下の様にファイルをリード属性でオープンするとエラーになります。

```

    fp = fopen("/mdeia/usb/test.txt","r");
    
```

オープンすると、エラーになり、errno=2が帰ってきます。  
コマンドラインからマニュアルでマウントし、catでファイル内容を表示しても問題ありません。

プロテクトOFFでは、正常にオープン出来ます。

`ls -al` ファイル属性を見ても、プロテクトON/OFFでは差がありません。

プロテクトONでは、`fopen()`でオープン出来無いのでしょうか？

* * *
```

    fd = open("/media/usb/test.txt", O_RDONLY);
    
```

も試して見ました。やはり`fopen()`と同じでプロテクトONでは-1が返り、プロテクトOFFではオープン出来ました。
CC BY-SA 3.0
2016-12-03T02:44:11.107
30855
2017-08-16T20:05:29.023
2016-12-06T08:47:22.810
3054
19169
question
linux c
ライトプロテクト機能付きUSBメモリのファイルオープンについて
[GNU cat](http://git.savannah.gnu.org/cgit/coreutils.git/plain/src/cat.c)
のソースを見てみました。

オプションなしの場合は `O_RDWR | O_BINARY` で読み込んでるようですので 試してみると良いかもしれません。

```

      if (! (number || show_ends || squeeze_blank))
        {
          file_open_mode |= O_BINARY;
          xset_binary_mode (STDOUT_FILENO, O_BINARY);
        }
    
      /* Check if any of the input files are the same as the output file.  */
    
      /* Main loop.  */
    
      infile = "-";
      argind = optind;
    
      do
        {
          if (argind < argc)
            infile = argv[argind];
    
          if (STREQ (infile, "-"))
            {
              have_read_stdin = true;
              input_desc = STDIN_FILENO;
              if (file_open_mode & O_BINARY)
                xset_binary_mode (STDIN_FILENO, O_BINARY);
            }
          else
            {
              input_desc = open (infile, file_open_mode);
              if (input_desc < 0)
                {
                  error (0, errno, "%s", quotef (infile));
                  ok = false;
                  continue;
                }
            }
    
```
CC BY-SA 3.0
2017-06-17T04:09:57.293
35656
2017-06-17T04:09:57.293
5008
30855
answer