Я работаю над встроенной системой 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
Путаница поведения Open () с O_CREAT | O_EXCL в Linux ⇐ Linux
-
Anonymous
1741741294
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
Подробнее здесь: [url]https://stackoverflow.com/questions/79502389/confusion-of-the-behavior-open-with-o-creato-excl-in-linux[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия