Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C语言中读取不同线程中的文件_C_Multithreading_Pthreads - Fatal编程技术网

在C语言中读取不同线程中的文件

在C语言中读取不同线程中的文件,c,multithreading,pthreads,C,Multithreading,Pthreads,我有一个多线程服务器程序,其中每个线程都需要读取文件的内容,以检索客户端请求的数据 我在C中使用pthreads来创建一个线程,并将函数传递给线程将执行的线程 在函数中,如果我用fopen()指定一个新的文件指针,然后用fgets()读取文件内容,每个线程是否都有自己的文件偏移量?也就是说,如果线程1正在从文件中读取,并且当线程2第一次读取时它位于文件的第5行,那么线程2是从第5行开始读取,还是独立于线程1在文件中的位置?每个打开的文件都只有一个文件指针。它有一个关联的FD和一个文件位置(如您所

我有一个多线程服务器程序,其中每个线程都需要读取文件的内容,以检索客户端请求的数据

我在C中使用pthreads来创建一个线程,并将函数传递给线程将执行的线程


在函数中,如果我用
fopen()
指定一个新的
文件
指针,然后用
fgets()
读取文件内容,每个线程是否都有自己的文件偏移量?也就是说,如果线程1正在从文件中读取,并且当线程2第一次读取时它位于文件的第5行,那么线程2是从第5行开始读取,还是独立于线程1在文件中的位置?

每个打开的
文件都只有一个文件指针。它有一个关联的FD和一个文件位置(如您所说的文件偏移量)

但是您可以
fopen
两次(从两个不同的线程或者从同一个线程)打开文件,正如您现在所做的编辑所暗示的那样。这意味着您将有两个关联的FD和两个单独的文件位置


也就是说,这与线程本身无关,只是如果您想要单独的文件位置,您将需要两个FD(使用stdio),这意味着两个
文件
s。

每个打开的
文件
只有一个文件指针。它有一个关联的FD和一个文件位置(如您所说的文件偏移量)

但是您可以
fopen
两次(从两个不同的线程或者从同一个线程)打开文件,正如您现在所做的编辑所暗示的那样。这意味着您将有两个关联的FD和两个单独的文件位置


也就是说,这与线程本身无关,只是如果您想要单独的文件位置,您将需要两个FD(使用stdio),这意味着两个
文件
s.

请参见编辑。我的意思是,我在函数中打开一个
文件
,因此每个线程都会打开自己的
文件
。只要您不使用特定
文件*
中的
dup()
dup2()
(或
fcntl()
)上的
fileno(fp)
,所有注释都是准确的。破坏东西是有可能的,但你必须用自己的方式去做。即使使用低级文件描述符I/O,每个
open()
调用都会提供一个引用新打开文件描述的新文件描述符,并且读/写位置与打开文件描述相关联。同样,只要不使用
dup2()
,并且没有两个线程同时使用同一个文件描述符,就不会有任何问题。请参阅编辑。我的意思是,我在函数中打开一个
文件
,因此每个线程都会打开自己的
文件
。只要您不使用特定
文件*
中的
dup()
dup2()
(或
fcntl()
)上的
fileno(fp)
,所有注释都是准确的。破坏东西是有可能的,但你必须用自己的方式去做。即使使用低级文件描述符I/O,每个
open()
调用都会提供一个引用新打开文件描述的新文件描述符,并且读/写位置与打开文件描述相关联。同样,只要不使用<代码> dUP2()//>代码,并且没有两个线程同时使用同一个文件描述符,就不会有任何麻烦。请考虑<代码> MAMP()/<代码>文件,然后将其作为只读传递给线程。考虑<代码> MAMP()/<代码>文件,然后将其作为只读传递给线程。