当程序无法连接其他主机时,我的文件描述符用完了.close()系统调用不起作用,打开套接字的数量增加.我可以用它
cat/proc/sys/fs/file-nr
从控制台打印:
connect:没有到主机的路由
close:错误的文件描述符
connect:没有到主机的路由
close:错误的文件描述符
..
码:
#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <string.h>
#include <iostream>
using namespace std;
#define PORT 1238
#define MESSAGE "Yow!!! Are we having fun yet?!?"
#define SERVERHOST "192.168.9.101"
void
write_to_server (int filedes)
{
int nbytes;
nbytes = write (filedes, MESSAGE, strlen (MESSAGE) + 1);
if (nbytes < 0)
{
perror ("write");
}
}
void
init_sockaddr (struct sockaddr_in *name,
const char *hostname,
uint16_t port)
{
struct hostent *hostinfo;
name->sin_family …Run Code Online (Sandbox Code Playgroud) 如何获取Java数据报套接字的文件描述符?我在网上搜索没有任何成功.
作者Srini
来自SELECT_TUT:
"...用于有效地监视多个文件描述符,以查看它们中的任何一个是否已成为"准备好";也就是说,查看I/O是否成为可能,或者是否出现"异常情况"描述符....
那么select()有什么意义呢?我不能随时随地读写我的描述符吗?select()的意思是它同时监视多个描述符,并在没有活动时正确地将进程置于休眠状态.Unix程序员经常发现他们必须处理来自多个文件描述符的I/O,其中数据流可能是间歇性的.如果你只是创建一个read(2)和write(2)调用序列,你会发现你的一个调用可能会阻止等待来自/到文件描述符的数据,而另一个文件描述符虽然已经准备就绪但未被使用/ O.select()有效地应对了这种情况."
有人可以解释我,这意味着什么以及如何运作,也许只是一个小例子.
例如,这里只选择一个文件句柄,为什么我需要监控?
my $timeout = 10;
my ( $in, $out ) = ( '', '' );
vec( $in, fileno( STDIN ), 1 ) = 1;
select( $out = $in, undef, undef, $timeout );
Run Code Online (Sandbox Code Playgroud) 我正在尝试制作一个迷你shell,其中命令是相互管道的.在代码中的某些点我做:
close(1) //closing stdout
Run Code Online (Sandbox Code Playgroud)
和
close(0) //closing stdin
Run Code Online (Sandbox Code Playgroud)
但是后来我正在分叉,所以我希望我的新子进程重置所有内容.那我该怎么做:
*function_name_here*(1) //reopening stdout
Run Code Online (Sandbox Code Playgroud)
和
*function_name_here*(0) //reopening stdin
Run Code Online (Sandbox Code Playgroud) 我有一个写(2)函数的有趣问题.PrepareResponseForSetCoordinates函数在写入时导致错误的文件描述符错误.
这是错误行:perror("ERROR写入套接字"); 总输出:ERROR写入套接字:错误的文件描述符
我确信我已经建立了连接,因为PrepareResponseForConnectionTest就像一个魅力.
你能对错误的原因有所了解吗?
当我使用gcc作为编译器时没有问题.之后因为使用多个新的cpp源我使用g ++作为编译器而且我有这个错误.
问候
这是我的代码:
#define MAX_PMS_MESSAGE_LEN (4096)
unsigned char baCommBuffer[MAX_PMS_MESSAGE_LEN];
unsigned char PrepareResponseForSetCoordinates(void)
{
unsigned char baTempBuff[255]={0};
unsigned short bCnt=0,i=0,bCsum=0,bCnt2=0;
time_t lEpochTime;
time_t lSessionTime;
memset(baTempBuff,0,sizeof(baTempBuff));
memset(baCommBuffer,0,sizeof(baCommBuffer));
bzero(baCommBuffer,MAX_PMS_MESSAGE_LEN);
bzero(baTempBuff,sizeof(baTempBuff));
lEpochTime = time(NULL);
baCommBuffer[bCnt++] = START_CHAR;
baCommBuffer[bCnt++] = START_CHAR;
baCommBuffer[bCnt++] = PACKET_SEPERATOR;
sprintf((char*)baTempBuff,"%ld",(unsigned long)lEpochTime);
memcpy(baCommBuffer+bCnt,baTempBuff,10);
bzero(baTempBuff,sizeof(baTempBuff));
bCnt+=10;
baCommBuffer[bCnt++] = PACKET_SEPERATOR;
// lSessionTime = time(NULL);
if(SPMSMessage.lSessionID)
lSessionTime = SPMSMessage.lSessionID;
else
lSessionTime=lEpochTime;
sprintf((char*)baTempBuff,"%ld",(unsigned long)lSessionTime);
memcpy(baCommBuffer+bCnt,baTempBuff,10);
bzero(baTempBuff,sizeof(baTempBuff));
bCnt+=10;
baCommBuffer[bCnt++] = PACKET_SEPERATOR;
baCommBuffer[bCnt++] = PMC_ID;
baCommBuffer[bCnt++] = PACKET_SEPERATOR;
baCommBuffer[bCnt++] = PMS_ID; …Run Code Online (Sandbox Code Playgroud) 这是我第一次使用文件描述符进行读取,并且我已经通过反复试验进行了大约3个小时的测试,而我的读取器几乎可以正常工作!我只需要一点帮助来检查命名管道上的EOF。
好的,这样我就可以打开一个(多个)命名管道:
fds[j].fd = open(pipeNameo, O_RDWR) ; // storing it into my file descriptor array
Run Code Online (Sandbox Code Playgroud)
然后我在轮询命名管道以查看是否发生了任何事情(轮询在循环内):
int ret = poll(fds, numOfPipesUsed, timeout_msecs);
Run Code Online (Sandbox Code Playgroud)
当确实发生问题时,我通过发送写入该函数的文件描述符来处理文件:
int processFileDes( int fd )
{
char buf[10] ;
read(fd, buf, 1) ;
char curr = buf[0] ;
while (curr != EOF)
{
if ( curr == ' ')
{
// do nothing it is a space
}
else if ( curr == '\n')
{
printf("NEW LINE!\n") ;
}
else
{
int num = curr - '0' …Run Code Online (Sandbox Code Playgroud) 我有一个C程序,它接受输出文件名并将数据转储到其中.很可能该程序使用FILE*指针.是否可以将终端stdout传递给该C程序?我无权访问该代码.
我的意思是,该计划的工作原理如下 -
> ./program out.txt # --> dumps data into out.txt
Run Code Online (Sandbox Code Playgroud)
我想做的是像 -
> ./program &1 # --> dumps data on the terminal.
Run Code Online (Sandbox Code Playgroud)
可能吗?怎么做到呢?
我有一个bash脚本,它发出一个cURL请求并将输出写入一个名为的文件resp.txt.我需要创建一个独占锁,以便我可以写入该文件,而不用担心多个用户同时运行脚本和编辑文本文件.
这是我希望锁定文件,执行请求和写入文本文件的代码:
(
flock -e 200
curl 'someurl' -H 'someHeader' > resp.txt
) 200>/home/user/ITS/resp.txt
Run Code Online (Sandbox Code Playgroud)
这是正确的方法吗?我的实际脚本比这个有点长,但是当我将flock语法添加到bash脚本时它似乎会中断.我的理解是,这会创建一个可以写入锁定文件的子shell.我只是不确定是否需要将文件描述符添加到curl请求中,如下所示:
curl 'someurl' -H 'someHeader' 200>resp.txt
Run Code Online (Sandbox Code Playgroud)
如果有人可以解释这些文件描述符是如何工作的,让我知道我是否正确锁定文件会很棒!
我想使用write()函数将struct对象写入文件.它必须是那个功能.
我在终端的输入是:./ main.c output.dat John Doe 45
当我运行程序并打开output.dat时,有一堆字母没有意义.请帮我.
我在output.dat文件中想要的输出是:John Doe 45
我的代码:
struct Person{
char* name;
char* lastName;
char* age;
};
int main(int argc, char** argv){
struct Person human;
/* get the argument values and store them into char* */
char* fileName = argv[1];
char* name = argv[2];
char* lastName = argv[3];
char* age = argv[4];
/* set the values of human object */
human.name = name;
human.lastName = lastName;
human.age = age;
/* open the file */ …Run Code Online (Sandbox Code Playgroud) 假设我们想要使用Node.js进程池,使用React渲染一些HTML.(我不是说这是一个好主意,只是假设是这种情况,lulz).
有没有办法将Golang的请求/响应流的引用传递给Node.js进程?我认为Node.js的集群模块使用这种技术,通过传递文件描述符或类似的东西.请注意,Node.js进程池(可能是3个进程左右)将是Golang进程的子进程.