2014-06-24 56 views
0

我目前正试图实现一个并发服务器(即通过派生新子进程来处理多个进程)。使用fnctl()锁定和解锁文件进行读写(多个进程)

每个客户端执行读取/写入请求以从位于服务器中的file.txt读取。我目前使用fnctl()来处理同步,即。我可以有多个读取,但只有一个写入。

这是我做了什么至今的样本代码:

{ 
    FILE *file = fopen("file.txt", "w+"); 

    fd = fileno(file); 

    printf("\nThis is the file descriptor : %d\n", fd); 

    if(file == NULL) 
    printf("File cannot be opened"); 

    printf("\nLocking!!!!"); 

    //initliazing the flock structure 
    memset(&lock, 0, sizeof(lock)); //setting 0 as a value 
    lock.l_type = F_WRLCK; //F_RDLCK, F_WRLCK, F_UNLCK 
    lock.l_whence = SEEK_SET; //SEEK_SET, SEEK_CUR, SEEK_END 
    lock.l_start = 0; //offset from l_whence 
    lock.l_len = 0; //length, 0 = to EOF 
    lock.l_pid = getpid(); //the processes's PID 


    //placing a write lock on the file 
    fcntl(fd, F_SETLKW, &lock); 

    printf("\nLocked-------"); 

    fwrite(buff + 1, 1, strlen(buff) - 1, file); 
    //lock_realease(&l); 
    printf("\nHit enter to unlock the file !"); 
    getchar(); 

    printf("\nFinished writing so we can unlock file !"); 

    //Releasing lock 
    lock.l_type = F_UNLCK; //unlocks the region of the file 
    fcntl(fd, F_SETLKW,&lock); 

    printf("\nFile unlocked!"); 
} 

有人能指导我,如果我在正确的方向吗?

回答

0

也许吧。您必须添加错误处理(所以您注意到锁定失败时),等待(锁定失败时)和超时(另一个孩子被卡住且锁定从未释放时)。

但以我的经验,这个过程是脆弱的。改为创建一个套接字。让孩子们连接到插座。然后使用主进程将命令提供给子级。在这种情况下,主进程替换单个文件。

这有两个优点:

  • 主过程保持对孩子的状态选项卡(他们在做什么的),你可以写一个工具来查看该统计。稍后,您可以将其用于健康监测。
  • 您不需要使用套接字锁定。
+0

你能给我一些关于如何执行这样的错误处理和请等待的指导吗? – user3770009

+0

对于错误处理,您需要检查您所调用功能的手册。通常,你必须检查你调用的所有函数的返回值。对于等待而言,这更复杂。你需要找到一个功能,让你的孩子睡觉和一个循环,并以某种方式来注意当你等待了太久。 –

+0

谢谢我会尝试 – user3770009