分页: 1 / 1

把软件注册成服务后STDIN_FILENO一直可读是什么原因。

发表于 : 2023-08-09 16:51
飞翔的薄荷
把软件注册成服务,select和read一直成功,都到的都是数字0,谁在一直往我的程序STDIN_FILENO一直写东西?。

代码:
auto nRet = select(STDIN_FILENO + 1, &rdfs, NULL, NULL, &tv);
char szBuf = {};
auto nRet = read(STDIN_FILENO, &szBuf, sizeof(szBuf));

select和read都成功,STDIN_FILENO一直可读,cpu都用完了不知道啥原因。

Re: 把软件注册成服务后STDIN_FILENO一直可读是什么原因。

发表于 : 2023-08-10 0:30
astolia
如果你是把char szBuf[] = {};写成了char szBuf = {};,那么sizeof(szBuf)得到的结果是0,read实际上没去读东西,所以返回0

Re: 把软件注册成服务后STDIN_FILENO一直可读是什么原因。

发表于 : 2023-08-10 10:10
飞翔的薄荷
astolia 写了: 2023-08-10 0:30 如果你是把char szBuf[] = {};写成了char szBuf = {};,那么sizeof(szBuf)得到的结果是0,read实际上没去读东西,所以返回0
sizeof(szBuf)是1。不是0.

Re: 把软件注册成服务后STDIN_FILENO一直可读是什么原因。

发表于 : 2023-08-10 11:58
飞翔的薄荷
测试发现
注册服务的[Service]中
这种写法不会收的0,ExecStart=/bin/bash -c "/home/kk/111/CMakeProject1"
这种写法会收的0,ExecStart=/home/kk/111/CMakeProject1
有谁知道怎么回事么?

Re: 把软件注册成服务后STDIN_FILENO一直可读是什么原因。

发表于 : 2023-08-10 13:05
astolia
守护进程stdin是指向/dev/null,从/dev/null用read读也是立即返回,返回值为0
飞翔的薄荷 写了: 2023-08-10 11:58 测试发现
注册服务的[Service]中
这种写法不会收的0,ExecStart=/bin/bash -c "/home/kk/111/CMakeProject1"
这种写法会收的0,ExecStart=/home/kk/111/CMakeProject1
有谁知道怎么回事么?
先把话说清楚。“收的0”是指szBuf的值为0还是nRet的值为0?

Re: 把软件注册成服务后STDIN_FILENO一直可读是什么原因。

发表于 : 2023-08-10 15:22
飞翔的薄荷
astolia 写了: 2023-08-10 13:05 守护进程stdin是指向/dev/null,从/dev/null用read读也是立即返回,返回值为0
飞翔的薄荷 写了: 2023-08-10 11:58 测试发现
注册服务的[Service]中
这种写法不会收的0,ExecStart=/bin/bash -c "/home/kk/111/CMakeProject1"
这种写法会收的0,ExecStart=/home/kk/111/CMakeProject1
有谁知道怎么回事么?
先把话说清楚。“收的0”是指szBuf的值为0还是nRet的值为0?
已解决。刚刚查了下select可读也可以表示文件结束。read我没判定返回值为0的情况,为0表示文件结束了。