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

软件和网站开发以及相关技术探讨
回复
飞翔的薄荷
帖子: 30
注册时间: 2011-12-08 22:46

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

#1

帖子 飞翔的薄荷 » 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都用完了不知道啥原因。
头像
astolia
论坛版主
帖子: 6454
注册时间: 2008-09-18 13:11

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

#2

帖子 astolia » 2023-08-10 0:30

如果你是把char szBuf[] = {};写成了char szBuf = {};,那么sizeof(szBuf)得到的结果是0,read实际上没去读东西,所以返回0
飞翔的薄荷
帖子: 30
注册时间: 2011-12-08 22:46

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

#3

帖子 飞翔的薄荷 » 2023-08-10 10:10

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

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

#4

帖子 飞翔的薄荷 » 2023-08-10 11:58

测试发现
注册服务的[Service]中
这种写法不会收的0,ExecStart=/bin/bash -c "/home/kk/111/CMakeProject1"
这种写法会收的0,ExecStart=/home/kk/111/CMakeProject1
有谁知道怎么回事么?
头像
astolia
论坛版主
帖子: 6454
注册时间: 2008-09-18 13:11

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

#5

帖子 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?
飞翔的薄荷
帖子: 30
注册时间: 2011-12-08 22:46

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

#6

帖子 飞翔的薄荷 » 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表示文件结束了。
回复