标签: posix

为什么start_routine for pthread_create返回void*并取无效*

pthread_create看起来像这样的函数头:

int pthread_create(pthread_t * thread, 
                   const pthread_attr_t * attr,
                   void * (*start_routine)(void *), 
                   void *arg);
Run Code Online (Sandbox Code Playgroud)

我理解这一切除了函数指针start_routine的形式void* (*fpointer) (void*),这意味着它接受一个void指针并返回一个void指针.

它所采用的void指针只是一种将参数传递给start_routine的方法,我得到了那个部分,但是我不明白为什么函数返回一个void指针?什么代码甚至会注意到void指针?

c posix pthreads

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

在sigprocmask()中设置和设置

我还没完全明白,怎么用sigprocmask().特别是,如何setoldset它的语法的工作和如何使用它们.

int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);
Run Code Online (Sandbox Code Playgroud)

请解释一个例子,阻止,说SIGUSR1几秒钟,然后解锁并处理它.

c posix signals sigprocmask

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

使用Boost在Linux中设置线程优先级

Boost Libraries似乎没有设置线程优先级的设备.这是在Linux上使用的最佳代码还是有更好的方法?

boost::thread myThread( MyFunction() );

struct sched_param param;
param.sched_priority = 90;
pthread_attr_setschedparam( myThread.native_handle(), SCHED_RR, &param);
Run Code Online (Sandbox Code Playgroud)

我没有很多Linux编程经验.

c++ linux boost posix pthreads

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

Posix共享内存与映射文件

在了解了这个主题之后,任何人都可以说,POSIX共享内存(shm_open)和POSIX映射文件(mmap)之间的真正区别是什么?

两者似乎都使用/ dev/tmpfs子系统,而不是旧的IPC机制.

那么在共享内存上使用mmap文件有什么好处吗?

谢谢.

posix shared-memory memory-mapped-files

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

谁使用POSIX实时信号?为什么?

我没有被翻转我真的不明白.我刚读了一大堆关于它们的材料,我无法弄清楚用例.我并不是在谈论如此多的关于API的问题,因为它比signal()这样的优点足够清晰.相反,似乎RT信号是用户空间生成但是到底是什么?唯一的用途似乎是原始的IPC,但一切都指向它们是一种糟糕的IPC形式(例如笨拙,有限的信息,不是特别有效等).

那么他们在哪里以及如何使用?

c linux embedded posix signals

25
推荐指数
3
解决办法
9110
查看次数

用shell中的管道连接n个命令?

我试图在C中实现一个shell.我可以用一个简单的execvp()来执行简单的命令,但其中一个要求是管理这样的命令:"ls -l | head | tail -4"with a for '循环并且只有一个'pipe()'语句重定向stdin和stdout.几天后,我有点迷失了.

N =简单命令的数量(示例中为3:ls,head,tail)命令=带有命令的结构列表,如下所示:

commands[0].argv[0]: ls
commands[0].argv[1]: -l
commands[1].argv[0]: head
commands[2].argv[0]: tail
commands[2].argv[1]: -4
Run Code Online (Sandbox Code Playgroud)

所以,我做了for循环,并开始重定向stdin和stdout以便用管道连接所有命令,但是...我只是无能为力它为什么不起作用.

for (i=0; i < n; i++){

pipe(pipe);
if(fork()==0){  // CHILD

    close(pipe[0]);
    close(1);
    dup(pipe[1]);
    close(pipe[1]);

    execvp(commands[i].argv[0], &commands[i].argv[0]);
    perror("ERROR: ");
    exit(-1);

}else{      // FATHER

    close(pipe[1]);
    close(0);
    dup(pipe[0]);
    close(pipe[0]);

}
}
Run Code Online (Sandbox Code Playgroud)

我想要创建的是一系列childed进程:

[ls -l] ---- pipe ----> [head] ---- pipe ----> [tail -4]

所有这些进程都有一个root(运行我的shell的进程)所以,第一个父亲也是shell进程的一个孩子,我已经有点筋疲力尽了,有人可以帮助我吗?

我甚至不确定孩子是否应该是执行命令的孩子.

多谢你们 !!

c shell posix pipe

25
推荐指数
1
解决办法
5万
查看次数

Linux上真的没有异步块I/O吗?

考虑一个受CPU限制的应用程序,但也具有高性能I/O要求.

我正在将Linux文件I/O与Windows进行比较,我看不出epoll将如何帮助Linux程序.内核会告诉我文件描述符"准备好读取",但是我仍然需要调用阻塞read()来获取我的数据,如果我想读取兆字节,那么很明显它会阻塞.

在Windows上,我可以创建一个设置了OVERLAPPED的文件句柄,然后使用非阻塞I/O,并在I/O完成时收到通知,并使用该完成函数中的数据.我需要不花费应用程序级别的挂钟时间等待数据,这意味着我可以精确地将我的线程数调整为我的内核数量,并获得100%的高效CPU利用率.

如果我必须在Linux上模拟异步I/O,那么我必须分配一些线程来执行此操作,并且这些线程将花费一些时间来处理CPU事务,并且大量时间阻塞I/O,此外,在这些线程的消息传递中会有开销.因此,我将过度订阅或利用我的CPU核心.

我把mmap()+ madvise()(WILLNEED)视为"穷人的异步I/O",但它仍然没有完全通过那里,因为当它完成时我无法得到通知 - 我有"猜测",如果我猜"错误",我将最终阻止内存访问,等待数据来自磁盘.

Linux似乎在io_submit中启动了异步I/O,它似乎也有一个用户空间POSIX aio实现,但它已经有一段时间了,我知道没有人会担保这些系统的关键,高性能的应用程序.

Windows模型的工作方式大致如下:

  1. 发出异步操作.
  2. 将异步操作绑定到特定的I/O完成端口.
  3. 等待该端口上的操作完成
  4. 当I/O完成时,等待端口的线程解除阻塞,并返回对挂起的I/O操作的引用.

步骤1/2通常作为单个事物完成.步骤3/4通常使用工作线程池完成,而不是(必要)与发出I/O相同的线程.这个模型有点类似于boost :: asio提供的模型,除了boost :: asio实际上不会给你异步的基于块的(磁盘)I/O.

Linux中epoll的不同之处在于,在步骤4中,还没有I/O发生 - 它会在步骤4之后提升第1步,如果你确切知道你需要的话,那就是"向后".

编写了大量的嵌入式,桌面和服务器操作系统之后,我可以说这种异步I/O模型对于某些类型的程序来说非常自然.它还具有非常高的吞吐量和低开销.我认为这是Linux I/O模型在API级别上仍然存在的真正缺点之一.

linux posix asynchronous overlapped-io

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

相当于破折号外壳中的pipefail

是否有一些类似的选项dash对应于外壳pipefailbash

或者,如果管道中的一个命令失败(但没有在其上退出,set -e那么)获得非零状态的任何其他方式.

为了更清楚,这是我想要实现的一个例子:

在调试makefile示例中,我的规则如下所示:

set -o pipefail; gcc -Wall $$f.c -o $$f 2>&1 | tee err; if [ $$? -ne 0 ]; then vim -o $$f.c err; ./$$f; fi;
Run Code Online (Sandbox Code Playgroud)

基本上它运行会在出错时打开错误文件和源文件,并在没有错误时运行程序.给我一些打字.上面的代码段运行良好,bash但我的新Ubunty系统使用dash似乎不支持pipefail选项.

如果下面一组命令的第一部分失败,我基本上想要一个FAILURE状态:

gcc -Wall $$f.c -o $$f 2>&1 | tee err
Run Code Online (Sandbox Code Playgroud)

所以我可以用它来if表达.

有没有其他方法可以实现它?

谢谢!

bash posix pipe dash-shell

25
推荐指数
2
解决办法
4533
查看次数

什么是文件系统的posix合规性?

Posix合规性是许多公司遵循的标准.我对这方面的问题很少,1.所有文件系统都需要兼容posix吗?2.申请是否也需要符合posix标准?3.有没有非posix文件系统?

filesystems posix

24
推荐指数
3
解决办法
2万
查看次数

接收警告"隐含声明功能'strlen'"

我有一些简单的代码,但我收到一个警告:

-bash-3.2$ gcc -Wall print_process_environ.c -o p_p
print_process_environ.c: In function 'print_process_environ':
print_process_environ.c:24: warning: implicit declaration of function 'strlen'
print_process_environ.c:24: warning: incompatible implicit declaration of built-in function 'strlen'
Run Code Online (Sandbox Code Playgroud)

以下是代码:

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <strings.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>
#include <strings.h>

    void
    print_process_environ(pid_t pid)
    {
        int     fd;
        char    filename[24];
        char    environ[1024];
        size_t  length;
        char    *next_var;

        snprintf(filename, sizeof(filename), "/proc/%d/environ", (int)pid);
        printf("length of filename: %d\n", strlen(filename));

        fd = open(filename, O_RDONLY);
......
Run Code Online (Sandbox Code Playgroud)

定义strlen()是:

   #include <string.h>

   size_t strlen(const char …
Run Code Online (Sandbox Code Playgroud)

c posix

24
推荐指数
2
解决办法
5万
查看次数