Путаница поведения Open () с O_CREAT | O_EXCL в LinuxLinux

Ответить
Anonymous
 Путаница поведения Open () с O_CREAT | O_EXCL в Linux

Сообщение Anonymous »

Я работаю над встроенной системой Linux (Kernel-5.10.188), где ADBD работает в целевой системе.
В целевой системе я создал файл с Echo "Hello">/data/open , затем я запустил следующую команду в PC Windows.PS C:\Users\aa> adb push C:\test\open /data/
C:\test\open: 1 file pushed. 0.7 MB/s (17096 bytes in 0.023s)
< /code>
В целевой системе < /p>
# ls /data/open -l
-rw-rw-rw- 1 root root 17096 Mar 11 10:28 /data/open

Функция harder_send_file () в file_sync_service.c выглядит следующим образом (я добавил 3 строки printf)
196 static int handle_send_file(int s, char *path, mode_t mode, char *buffer)
197 {
198 syncmsg msg;
199 unsigned int timestamp = 0;
200 int fd;
201
202 printf("XXXXXX %s, path: %s, mode: %o\n", __func__, path, mode);
203 fd = adb_open_mode(path, O_WRONLY | O_CREAT | O_EXCL, mode);
204 printf("XXXXX fd: %d, errno: %d\n", fd, errno);
205 if(fd < 0 && errno == ENOENT) {
206 mkdirs(path);
207 fd = adb_open_mode(path, O_WRONLY | O_CREAT | O_EXCL, mode);
208 }
209 printf("XXXXX fd: %d, errno: %d\n", fd, errno);
210 if(fd < 0 && errno == EEXIST) {
211 fd = adb_open_mode(path, O_WRONLY, mode);
212 }
213 if(fd < 0) {
214 if(fail_errno(s))
215 return -1;
216 fd = -1;
217 }
< /code>
Я запутался после прочтения кодов. < /p>
203 fd = adb_open_mode(path, O_WRONLY | O_CREAT | O_EXCL, mode);
204 printf("XXXXX fd: %d, errno: %d\n", fd, errno);

Я думаю, что если существует/data/open , строка 203 должна вернуть -1 с Errno of eexist , и она должна перейти в строку 211, чтобы открыть файл с O_WRONLY . Но это не так! < /P>
Но это показало последователи.XXXXXX handle_send_file, path: /data/open, mode: 666
XXXXX fd: 17, errno: 0
XXXXX fd: 17, errno: 0
sync: waiting for command

Я натолкнул снова с ПК и получил.
XXXXXX handle_send_file, path: /data/open, mode: 666
XXXXX fd: 17, errno: 0
XXXXX fd: 17, errno: 0
sync: waiting for command

Не возвращается ошибки, когда существует/data/open ! Это правильное и ожидаемое?280 /*
281 * TEMP_FAILURE_RETRY is defined by some, but not all, versions of
282 * . (Alas, it is not as standard as we'd hoped!) So, if it's
283 * not already defined, then define it here.
284 */
285 #ifndef TEMP_FAILURE_RETRY
286 /* Used to retry syscalls that can return EINTR. */
287 #define TEMP_FAILURE_RETRY(exp) ({ \
288 typeof (exp) _rc; \
289 do { \
290 _rc = (exp); \
291 } while (_rc == -1 && errno == EINTR); \
292 _rc; })
293 #endif

342 static __inline__ int adb_open_mode( const char* pathname, int options, int mode )
343 {
344 return TEMP_FAILURE_RETRY( open( pathname, options, mode ) );
345 }

Я думаю, что он вызывает Open , исправьте меня, если я ошибаюсь.#include
#include
#include
#include
#include

int adb_open_mode(const char *path, int flags, mode_t mode) {
return open(path, flags, mode);
}

void fake_mkdirs(const char *path) {
printf("Creating directories for %s\n", path);
}

int main(int argc, char **argv)
{
const char *path = "/tmp/testfile";
/// mode_t mode = 0644;
mode_t mode = 0666;
int fd;

if (argc != 2) {
printf("Usage: %s filetoopen\n", argv[0]);
exit(0);
}

path = argv[1];
fd = adb_open_mode(path, O_WRONLY | O_CREAT | O_EXCL, mode);
printf("%s: %d, fd: %d, errno: %d\n", __func__, __LINE__, fd, errno);
if (fd < 0 && errno == ENOENT) {
fake_mkdirs(path);
fd = adb_open_mode(path, O_WRONLY | O_CREAT | O_EXCL, mode);
printf("%s: %d, fd: %d, errno: %d\n", __func__, __LINE__, fd, errno);
}
printf("%s: %d, fd: %d, errno: %d\n", __func__, __LINE__, fd, errno);
if (fd < 0 && errno == EEXIST) {
fd = adb_open_mode(path, O_WRONLY, mode);
}
printf("%s: %d, fd: %d, errno: %d\n", __func__, __LINE__, fd, errno);

if (fd < 0) {
perror("Failed to open file");
} else {
printf("File opened successfully with fd %d\n", fd);
close(fd);
}

return 0;
}
< /code>
Я запустил его и получил последователи. < /p>
# ./a.out /data/open
main: 32, fd: -1, errno: 17
main: 38, fd: -1, errno: 17
main: 42, fd: 3, errno: 17
File opened successfully with fd 3


Подробнее здесь: https://stackoverflow.com/questions/795 ... l-in-linux
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Linux»