Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.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_Casting_Pthreads_Void Pointers_File Descriptor - Fatal编程技术网

C 将文件描述符传递给线程并在函数中使用(家庭作业)

C 将文件描述符传递给线程并在函数中使用(家庭作业),c,casting,pthreads,void-pointers,file-descriptor,C,Casting,Pthreads,Void Pointers,File Descriptor,我的任务是做一个打印服务器的精简多线程模型 get_服务器的原型功能是: void *get_request(void *arg); “参数arg指向从中读取请求的打开文件描述符。”因此,在测试中,建议使用STDIN_FILENO,但当所有操作都完成时,描述符需要是通用的 pthread_create(&tid, &attr, get_request, STDIN_FILENO); 在函数内部,我试图使用arg,但无法将其从void*更改为任何可用的。例如,这些都不起作用:

我的任务是做一个打印服务器的精简多线程模型

get_服务器的原型功能是:

void *get_request(void *arg);
“参数arg指向从中读取请求的打开文件描述符。”因此,在测试中,建议使用STDIN_FILENO,但当所有操作都完成时,描述符需要是通用的

pthread_create(&tid, &attr, get_request, STDIN_FILENO);
在函数内部,我试图使用arg,但无法将其从void*更改为任何可用的。例如,这些都不起作用:

read(*arg, intvariable, sizeof(int)); // can't cast void * error
int fd = *arg; // can't cast void * error
int fd = *(int *)arg; // seg fault
int fd = *((int *)arg); // seg fault

int fd = atoi(arg); // seg fault
// yes I'm aware arg isn't a char* but that's 
// from the example code we were given

你走在正确的道路上:

void *get_request(void *arg)
{
    int fd = (int) arg;

    ...
}

然而,这不是推荐的方法。而是创建一个变量并将其地址传递给
pthread\u create
调用:

int fd = STDIN_FILENO;
pthread_create(&tid, &attr, get_request, &fd);
然后你用

void *get_request(void *arg)
{
    int fd = *((int *) arg);

    ...
}

但是要小心,这样在线程启动之前,用于
pthread\u create
调用的变量的范围不会用完。然后您将有一个指向未使用内存的指针。将此变量放在
main
函数的顶部(如果您在
main
中调用
pthread\u create
)。

您的方法正确:

void *get_request(void *arg)
{
    int fd = (int) arg;

    ...
}

然而,这不是推荐的方法。而是创建一个变量并将其地址传递给
pthread\u create
调用:

int fd = STDIN_FILENO;
pthread_create(&tid, &attr, get_request, &fd);
然后你用

void *get_request(void *arg)
{
    int fd = *((int *) arg);

    ...
}
但是要小心,这样在线程启动之前,用于
pthread\u create
调用的变量的范围不会用完。然后您将有一个指向未使用内存的指针。将此变量放在
main
函数的顶部(如果您在
main
中调用
pthread\u create

您的函数需要一个指向值的指针,但您正在传递值本身!因此,要遵循指针方案,需要将指针传递给包含值
STDIN\u FILENO
的全局变量

或者,您可以像当前一样通过传递
STDIN\u FILENO
进行“欺骗”,然后将
void*
强制转换为一个简单的
int
(不是指针!),并按原样使用它:

int fd = (int) arg;
您的函数需要一个指向值的指针,但您正在传递值本身!因此,要遵循指针方案,需要将指针传递给包含值
STDIN\u FILENO
的全局变量

或者,您可以像当前一样通过传递
STDIN\u FILENO
进行“欺骗”,然后将
void*
强制转换为一个简单的
int
(不是指针!),并按原样使用它:

int fd = (int) arg;

非常感谢你的帮助。我很高兴看到我走上了正确的道路。有一件事我试过了,但忘了解释一下,那就是我试过pthread_create(&tid,&attr,get_request,&STDIN_FILENO);gcc回击道:“Print_server.c:21:46:error:lvalue需要作为一元操作数'&'操作数”,所以我从未想过将STDIN_FILENO的值保存到另一个变量中。非常感谢您的帮助。我很高兴看到我走上了正确的道路。有一件事我试过了,但忘了解释一下,那就是我试过pthread_create(&tid,&attr,get_request,&STDIN_FILENO);gcc回击道:“Print_server.c:21:46:error:lvalue作为一元操作数'&'操作数是必需的”,所以我从未想过将STDIN_FILENO的值保存到另一个变量中。感谢您的解释。也感谢您的解释。线程在赋值说明中引用。再次感谢。作业说明中引用了线程。再次感谢。