2012-01-31 3 views
3

open() с первой попытки (без такого файла или каталога) не срабатывает, но в последующих попытках работает нормально.
Моя программа запускает дочерний процесс и ждет, пока ребенок закончит работу с помощью waitpid(). Детский процесс создает копию пути к файлу, полученную от пользователя в определенном каталоге, с использованием execl().
Как только ребенок выходит, родительский процесс открывает эту вновь созданную копию, используя open(). Однако при первой попытке он не работает с ENOENT (без такого файла или каталога). Я вижу, что дочерний процесс создает файл в указанном каталоге.
Если я запустил эту программу еще раз, предоставив одно имя файла, тогда он отлично работает. Мой вопрос: почему он не открывает файл с первой попытки? Нужно ли обновлять каталог или что это такое?open() сбой при первой попытке

Я на RedHat

ЗДЕСЬ КРАТКИЙ N DIRTY фрагментам кода

my_function() 
{ 
char *src = "TEST.txt"; 
char *dest = "./Output/"; 
char *fp = "/Output/TEST.txt"; 
int fd; 
struct fstat file_stat; 

pid_t PID = fork(); 

if(PID == -1) 
     exit(1); 


if(PID == 0) 
{ 
     execl("/bin/cp", "/bin/cp", src, dest); 
     exit(1); 
} 


if(PID > 0) 
{ 
     int chldstat; 
     pid_t ws = waitpid(PID,&chldstat,WNOHANG); 
} 


if(stat(fp,&file_stat) == -1) 
{ 
     perror("stat"); 
     exit(1); 
} 


if((fd = open(dest,O_RDWR)) == -1) 
{ 
     perror("open"); 
     exit(1); 
} 


if((fp=mmap(0,file_stat.st_size,PROT_READ | PROT_WRITE,fd,0)) == -1) 
{ 
     perror("mmap"); 
     exit(1); 
} 


//OTHER ROUTINES  
............. 
............  
............ 


} 
+0

Можете ли вы опубликовать часть своего кода, пожалуйста? – Dave

+6

Вам нужно будет показать код, особенно. создание/ожидание дочернего процесса. Похоже, что-то напуганно, когда вы ждали, когда ребенок закончит. –

ответ

3

Как и другие отметили, что трудно ответить на этот вопрос без исходного кода. Но:

Вы, кажется, страдаете от состояния гонки. Файл создается, но немного позже вашей первой попытки открытия. Во второй попытке вам повезло, и файл уже создан.
Тот факт, что работа снова работает отлично, поддерживает эту теорию - файл существовал еще до начала программы, поэтому открытие его в любой момент может быть успешным.

Почему у вас есть состояние гонки? Если ребенок создает его, и отец пытается открыть его только после того, как он подтвердил, что ребенок закончил, тогда не должно быть никаких проблем.
Трудно предположить, что пошло не так. Может быть, вы ждете неправильного процесса. Возможно, ребенок создает другой процесс, который создает файл, а родитель ждет только первого ребенка. И миллион других майфов.

1

Вы вызываете waitpid() с флагом WNOHANG, а это означает, что он фактически не блокирует ожидание дочернего элемента, если он все еще запущен. Этот флаг используется для проверки того, изменилось ли состояние дочернего процесса, если оно не выполняется, если оно не выполняется; возвращаемое значение укажет, был ли ребенок готов. Если вы хотите, чтобы он блокировал его, удалите флаг WNOHANG. Однако обратите внимание, что он все равно может вернуться до изменения дочернего состояния, если вызов прерывается обработчиком сигнала. Если вас не волнует, успешно ли выйдет ребенок, вы можете написать:

while (waitpid(PID, &chldstat, 0) == -1 && errno == EINTR) 
    ; 
Смежные вопросы