EDEADLK를 올바르게 처리해야합니다. 내 프로그램에서 나는 두 아이들이 부모 수면까지 기다린 다음, 자물쇠를 적용하고 곧바로 떠나라고 봅니다. 미안하다. 나는 스페인 학생이다. 교착 상태에 대한여러 프로세스가 F_SETLKW를 사용하여 동일한 fd를 잠그면 교착 상태 (EDEADLK)가 표시되지 않는 이유는 무엇입니까?
int main(){
pid_t childpid, childpid2;
struct flock cerrojo;
int fd, status;
if ((fd=open("prueba", O_RDWR)) == -1)
perror("apertura fallo");
cerrojo.l_type =F_WRLCK;
cerrojo.l_whence =SEEK_SET;
cerrojo.l_start =0;
cerrojo.l_len =0;
if (fcntl(fd, F_SETLK,&cerrojo) == -1)
perror("cerrojo fallo");
if ((childpid= fork()) == -1) {
printf("Could not create child");
exit(-1);
}
if(childpid){
if ((childpid2= fork()) == -1) {
printf("Could not create child");
exit(-1);
}
if(childpid2){
cerrojo.l_type = F_UNLCK;
cerrojo.l_whence =SEEK_SET;
cerrojo.l_start =0;
cerrojo.l_len =0;
sleep(2);
fcntl(fd, F_SETLKW, &cerrojo);
waitpid(childpid,&status,0);
waitpid(childpid2,&status,0);
}
}
if(!childpid||!childpid2){
printf("Soy el hijo %d\n",getpid());
if(fcntl(fd, F_SETLKW,&cerrojo) == -1){
printf("FCNTL FALLA EN PID: %d\n",getpid());
sleep(1);
}
printf("PID %d va a quitar el cerrojo.\n",getpid());
cerrojo.l_type = F_UNLCK;
cerrojo.l_whence =SEEK_SET;
cerrojo.l_start =0;
cerrojo.l_len =0;
fcntl(fd, F_SETLKW, &cerrojo);
printf("HIJO ACABADO\n");
}
return 0;
}
"그 오류"_which_ 오류? 무슨 일이 일어날 것으로 예상됩니까? 대신 무엇이 발생합니까? 프로그램을 추적하려고 했습니까 ('strace -f')? 무슨 일이 일어나는 걸까요? –
edeadlk가 커널이 교착 상태를 피하는 방법을 알아야합니다. –
적어도 어떤 일이 일어나고 있는지, 어떻게 그것이 당신의 기대와 다른지 생각해보십시오. linux'strace -r -f -etrace = fcntl'은 많은 정보를 제공하지만 프로그램 출력만으로도 도움이 될 것입니다 :-) –