gpt4 book ai didi

c - flock() 的范围是什么?

转载 作者:太空狗 更新时间:2023-10-29 16:12:06 24 4
gpt4 key购买 nike

我正在测试从其他线程锁定文件描述符是否会影响主线程。

#include <iostream>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/types.h>
//#include <share.h>
#include <stdio.h>
#include <pthread.h>
#include <errno.h>

void *print_message_function( void *ptr );

pthread_mutex_t mut = PTHREAD_MUTEX_INITIALIZER;

int main (int argc, char * const argv[]) {

pthread_t thread1, thread2;
const char *message1 = "Thread 1";
const char *message2 = "Thread 2";
int iret1, iret2;

iret2 = pthread_create( &thread2, NULL, print_message_function, (void*) message1);

if(iret2)
{
fprintf(stderr,"Error - pthread_create() return code: %d\n",iret2);
fflush(stdout);
exit(EXIT_FAILURE);
}

printf("pthread_create() for thread 2 returns: %d\n",iret2);

pthread_mutex_lock(&mut);
sleep(1);

std::cout<<"Enter any key:"<<std::endl;
std::cin >> input;

if (fd2 = open( "file1", O_RDWR | O_CREAT | O_TRUNC, 0700 | 0x10) == -1)
{
perror("Cannot open file 2.\n");
fflush(stdout);
}
else
{
printf("File was opened 2!!\n");
fflush(stdout);
if(flock(fd2, LOCK_NB | LOCK_EX)==0)
{
printf("THE FILE WAS LOCKED 2.\n");
}
else if(errno == EAGAIN)
{
printf("The file is locked 2. Resource temporarily unavailable.\n");
}
}

pthread_mutex_unlock(&mut);

close(fd2);
std::cout<<"File closed."<<std::endl;
std::cin >> input;
return 0;
}


void *print_message_function( void *ptr )
{
char *message;
message = (char *) ptr;
printf("%s \n", message);
fflush(stdout);

int fd1;

if ((fd1 = open( "file1", O_RDWR | O_CREAT | O_TRUNC, 0700 | 0x10)) == -1)
{
perror("thread: Cannot open file 1.\n");
fflush(stdout);
//std::cin >> input;
}
else
{
printf("File was opened 1!!\n");
fflush(stdout);


if(flock(fd1, LOCK_NB | LOCK_EX)==0)
{
printf("THE FILE WAS LOCKED 1.\n");
}
else if(errno == EAGAIN)
{
printf("The file is locked 1. Resource temporarily unavailable.\n");
}
}

pthread_mutex_lock(&mut);
pthread_mutex_unlock(&mut);

printf("End of thread.\n");
}

输出:

[Session started at 2014-11-26 17:46:16 +0000.]
pthread_create() for thread 2 returns: 0
Thread 1
File was opened 1!!
THE FILE WAS LOCKED 1.
Enter any key:
1
File was opened 2!!
THE FILE WAS LOCKED 2.
File closed.
End of thread.

我不明白为什么在线程内使用的 flock() 不能阻止在主线程中使用的 flock() 获得锁。

来自 linux 手册页:

Locks created by flock() are associated with an open file description (see open(2)). This means that duplicate file descriptors (created by, for example, fork(2) or dup(2)) refer to the same lock, and this lock may be modified or released using any of these descriptors. Furthermore, the lock is released either by an explicit LOCK_UN operation on any of these duplicate descriptors, or when all such descriptors have been closed.

最佳答案

打字错误。此行错误地将 fd2(顺便说一句,您没有在发布的代码中声明)设置为 0,即 stdin:

if (fd2 = open( "file1",    O_RDWR | O_CREAT | O_TRUNC, 0700 | 0x10) == -1)

因此,fd1fd2 几乎肯定指的是不同的文件,您的练习重点就丢失了。你的意思是:

if ((fd2 = open("file1", ...)) == -1)

关于c - flock() 的范围是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27154593/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com