标签: posix

ssize_t 在 Linux 中定义在哪里?

操作系统:Debian 9 (Linux 4.9)

编译器:GCC 8.2

目前我包括<stddef.h>size_t定义在哪里)和<stdint.h>(定义了大多数整数类型),但我仍然没有ssize_t.

它在哪里定义?

c linux types posix include

17
推荐指数
2
解决办法
1万
查看次数

找出POSIX系统上是否存在命令

我希望能够从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/)

有任何想法吗?

unix shell posix

16
推荐指数
1
解决办法
6769
查看次数

是否有任何平台在fd_set上使用结构副本(对于select()或pselect())会导致问题?

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个打开文件描述符的效果有一些小问题- …

c unix linux posix

16
推荐指数
2
解决办法
5147
查看次数

在C上正确使用Stat

为什么这样做:

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 posix file

16
推荐指数
2
解决办法
6万
查看次数

Posix线程教程

我正在寻找一个全面的pthread教程.我考虑用posix线程购买编程,但这本书似乎有点过时了.像这样的其他在线教程非常基础.有人可以建议一个完整的pthread教程.

c c++ linux posix pthreads

16
推荐指数
2
解决办法
1万
查看次数

system()是否称为邪恶?

我正在设计一个C++应用程序,除其他外,它不时地执行一些脚本.该应用程序应该是高效的,并且最好是平台独

但问题是:有没有理由不应该使用system()call来启动脚本并使用例如POSIX设施?到目前为止我所看到的关于此事的讨论通常归结为:

  1. system()不太灵活.(我都可以)
  2. 它无法控制正在执行的命令.(对我来说很好,我只需要脚本中的返回值)
  3. 它不是平台独立的.(现在,这将是一个问题.我真的很想看到一个例子,它在不同的平台上表现不同)
  4. 这是一个安全问题.(同样,这也是一个问题.有人能提供潜在安全问题的例子system()吗?)
  5. 还有其他问题吗?

c++ posix

16
推荐指数
2
解决办法
3672
查看次数

UNIX/Linux/Mac OSX获得文件的许可作为号码

这一定非常简单,但完全是空白.我可以通过使用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)

如何翻译成若干为使用chmodchmod 755 otherFile.sh(与做出来的手工转换).

macos posix file-permissions

16
推荐指数
1
解决办法
3595
查看次数

如何关闭文件?

经过多年的经验,我觉得与Posix和平相处.

然后我从Linus Torvalds 读到这条消息,大约2002年:

int ret;
do {
    ret = close(fd);
} while(ret == -1 && errno != EBADF);
Run Code Online (Sandbox Code Playgroud)

没有.

以上是

(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在特定情况下似乎只允许阻止,可能没有一个适用于常规文件.我不是在所有的细节清晰,但你不应该看到EINTRclose没有通过选择到的东西fcntlsetsockopt.然而,这种可能性使通用库代码更加危险.

c linux multithreading posix signals

16
推荐指数
1
解决办法
4224
查看次数

既然我们有snprintf,为什么我们没有snscanf?

我有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

c posix

15
推荐指数
3
解决办法
1万
查看次数

为什么客户端调用shutdown(sockfd,SHUT_RD)后,客户端程序中的recv()会收到发送给客户端的消息?

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关联的套接字上的全双工连接的全部或部分关闭.如果howSHUT_RD,将不允许进一步接待.如果howSHUT_WR,则不允许进一步传输.如果howSHUT_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)

c sockets linux posix network-programming

15
推荐指数
1
解决办法
837
查看次数