gloabl文件描述符未在Linux上的线程之间共享

时间:2018-12-04 01:47:57

标签: c linux multithreading

我正在Linux上的一个小型C程序上工作,并且两个线程需要使用相同的文件描述符(实际上是unix域套接字),因此我只设置了文件描述符的gloabl变量,在一个线程中打开文件并在另一个线程,但似乎没有共享,我将代码简化如下:

#include<stdio.h>
#include<pthread.h>
#include<unistd.h>
#include<fcntl.h>

int gfd  = 0;
int test = 2;
void* thr_fun1(void* arg)
{
    printf("thr 1 gfd %d test %d \n",gfd, test);
}

int main()
{
    int gfd = open("aaa.txt", O_RDWR | O_CREAT, 0664);
    pthread_t tid;
    int err;
    printf("thr main gfd %d test %d \n",gfd, test);
    test = 12;
    err = pthread_create(&tid, NULL, thr_fun1, NULL);
    if(0 != err)
    printf("can't create thread\n");
    sleep(2);
}

操作系统为Ubuntu 16.04.4 LTS(GNU / Linux 4.13.0-36-通用x86_64)

liu@ns:~$ gcc -pthread -o fd fd.c
liu@ns:~$ ./fd
thr main gfd 3 test 2
thr 1 gfd 0 test 12

我的问题是:为什么共享全局变量test但不共享全局变量gfd

1 个答案:

答案 0 :(得分:1)

简短的回答是,您在线程中打印的名为gfd的变量是全局变量,而在main中设置的变量不是全局变量。您声明了两个不同的变量:

  1. int gfd = 0;这实际上是全球性的。
  2. int gfd = open("aaa.txt", O_RDWR | O_CREAT, 0664);这是main的本地内容。

main中的打印输出引用#2,而thr_fun1中的打印输出引用#1。

要更改此设置,请删除以下类型,将main中的赋值修改为赋值,而不是声明:

gfd = open("aaa.txt", O_RDWR | O_CREAT, 0664);