操作系统:Debian 9 (Linux 4.9)
编译器:GCC 8.2
目前我包括<stddef.h>(size_t定义在哪里)和<stdint.h>(定义了大多数整数类型),但我仍然没有ssize_t.
它在哪里定义?
我希望能够从shell脚本判断任何POSIX系统上是否存在命令.
在Linux上,我可以执行以下操作:
if which <command>; then
...snip...
fi
Run Code Online (Sandbox Code Playgroud)
但是,which当命令不存在时,Solaris和MacOS 不提供退出失败代码,它们只是向STDOUT输出错误消息.
另外,我最近发现which命令本身不是POSIX(参见http://www.opengroup.org/onlinepubs/009695399/utilities/)
有任何想法吗?
该select()和pselect()系统调用修改其参数(在" fd_set *"参数),所以输入值告诉系统文件描述符检查和返回值告诉程序员哪些文件描述符当前可用它.
如果要为同一组文件描述符重复调用它们,则需要确保每个调用都有一个描述符的新副本.显而易见的方法是使用结构副本:
fd_set ref_set_rd;
fd_set ref_set_wr;
fd_set ref_set_er;
...
...code to set the reference fd_set_xx values...
...
while (!done)
{
fd_set act_set_rd = ref_set_rd;
fd_set act_set_wr = ref_set_wr;
fd_set act_set_er = ref_set_er;
int bits_set = select(max_fd, &act_set_rd, &act_set_wr,
&act_set_er, &timeout);
if (bits_set > 0)
{
...process the output values of act_set_xx...
}
}
Run Code Online (Sandbox Code Playgroud)
(编辑删除不正确的struct fd_set引用 - 正如'R ..'所指出的那样.)
我的问题:
fd_set如图所示,对值进行结构复制是不安全的?我担心的是,有任何隐藏的内存分配或任何意外的事情.(有宏/函数FD_SET(),FD_CLR(),FD_ZERO()和FD_ISSET()来掩盖应用程序的内部.)
我可以看到MacOS X(达尔文)是安全的; 因此,其他基于BSD的系统可能是安全的.您可以通过记录您知道答案中安全的其他系统来提供帮助.
(我确实对fd_set使用超过8192个打开文件描述符的效果有一些小问题- …
为什么这样做:
char *fd = "myfile.txt";
struct stat buf;
stat(fd, &buf);
int size = buf.st_size;
printf("%d",size);
Run Code Online (Sandbox Code Playgroud)
但这不起作用:
char *fd = "myfile.txt";
struct stat *buf;
stat(fd, buf);
int size = buf->st_size;
printf("%d",size);
Run Code Online (Sandbox Code Playgroud) 我正在设计一个C++应用程序,除其他外,它不时地执行一些脚本.该应用程序应该是高效的,并且最好是平台独
但问题是:有没有理由不应该使用system()call来启动脚本并使用例如POSIX设施?到目前为止我所看到的关于此事的讨论通常归结为:
system()不太灵活.(我都可以) system()吗?)这一定非常简单,但完全是空白.我可以通过使用ls -la看到文件的权限,它可以提供类似的东西:
-rwxr-xr-x 1 james staff 68 8 Feb 13:33 basic.sh*
-rw-r--r-- 1 james staff 68 8 Feb 13:33 otherFile.sh*
Run Code Online (Sandbox Code Playgroud)
如何翻译成若干为使用chmod像chmod 755 otherFile.sh(与做出来的手工转换).
经过多年的经验,我觉得与Posix和平相处.
然后我从Linus Torvalds 读到这条消息,大约2002年:
Run Code Online (Sandbox Code Playgroud)int ret; do { ret = close(fd); } while(ret == -1 && errno != EBADF);没有.
以上是
(a)不便携
(b)不是现行做法
"不可移植"部分来自这样一个事实:(正如有人指出的那样),一个线程环境,其中内核确实关闭FD上的错误,FD可能已被有效地重用(由内核)用于其他一些线程并且第二次关闭FD是一个BUG.
不仅循环直到不可EBADF移植,而且任何循环都是,由于竞争条件我可能会注意到如果我没有通过将这些事情视为理所当然"取得和平".
但是,在GCC C++标准库实现中basic_file_stdio.cc,我们有
do
__err = fclose(_M_cfile);
while (__err && errno == EINTR);
Run Code Online (Sandbox Code Playgroud)
这个库的主要目标是Linux,但似乎并没有听从Linus.
据我所知,EINTR只有在系统调用块之后才会发生,这意味着内核在开始任何被中断的工作之前收到了释放描述符的请求.所以没有必要循环.实际上,SA_RESTART信号行为close默认不适用于并生成这样的循环,正是因为它不安全.
这是一个标准的库bug,对吗?在每个由C++应用程序关闭的文件上.
编辑:为了避免在一些大师出现回答之前引起太多警报,我应该注意到,close在特定情况下似乎只允许阻止,可能没有一个适用于常规文件.我不是在所有的细节清晰,但你不应该看到EINTR从close没有通过选择到的东西fcntl或setsockopt.然而,这种可能性使通用库代码更加危险.
我有snprintf它可以避免缓冲区溢出,但为什么没有调用函数snscanf?
码:
int main()
{
char * src = "helloeveryone";
char buf1[5];
sscanf(src,"%s",buf1); // here is a array out of bounds
}
Run Code Online (Sandbox Code Playgroud)
所以,我认为snscanf还需要一个.为什么我们只有snprintf?
从POSIX.1-2008/2013下载shutdown()的文档:
int shutdown(int socket, int how);...
该
shutdown()函数将导致与文件描述符套接字关联的套接字上的全双工连接的全部或部分关闭.该
shutdown()函数采用以下参数:
socket指定套接字的文件描述符.
how指定关闭的类型.值如下:
SHUT_RD禁用进一步的接收操作.SHUT_WR禁用进一步的发送操作.SHUT_RDWR禁用进一步的发送和接收操作....
在手动页
shutdown(2)
说,几乎同样的事情.
该
shutdown()调用导致与sockfd关联的套接字上的全双工连接的全部或部分关闭.如果how是SHUT_RD,将不允许进一步接待.如果how是SHUT_WR,则不允许进一步传输.如果how是SHUT_RDWR,将不允许进一步的接收和传输.
但我认为即使在shutdown(sockfd, SHUT_RD)通话后我也能收到数据
.这是我精心策划的测试和我观察到的结果.
------------------------------------------------------
Time netcat (nc) C (a.out) Result Observed
------------------------------------------------------
0 s listen - -
2 s connect() -
4 s send "aa" - -
6 s - recv() #1 recv() …Run Code Online (Sandbox Code Playgroud)