Tag: posix

vfork()调用后退出和返回之间的区别

我有一个程序具有未定义的行为(vfork()使用不当): #include #include #include int main ( int argc, char *argv[] ) { pid_t pid; printf(“___________befor fork______________.\n”); if((pid=vfork()) 0) printf(“parent\n”); else printf(“child\n”); printf(“pid: %d, ppid: %d\n”, getpid(), getppid()); //exit(0); return 0; } 如果我使用exit(0)函数而不是return – 输出是: ___________befor fork______________. child pid: 4370, ppid: 4369 parent pid: 4369, ppid: 2924 如果我使用return 0 – 我得到无限输出: ___________befor fork______________. child pid: […]

为什么使用select()而不是sleep()?

我正在编写一个关于iPhone音频的章节,并且遇到了一段我无法理解的代码: while (aqc.playPtr < aqc.sampleLen) { select(NULL, NULL, NULL, NULL, 1.0); } ( 完整代码示例在第163-166页 )。 根据我对代码的理解,音频正在另一个线程上处理,而while循环就是为了防止主线程在音频仍在处理时终止。 我不明白为什么使用select()而不是sleep() 。 从我读过的内容中, select()用于监视I / O的变化并传递它.NULLs没有做任何有意义的事情。 我使用sleep()运行代码,它按预期工作。 (我对低级别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); 我理解这一切除了start_routine的函数指针的forms为void* (*fpointer) (void*) ,这意味着它接受一个void指针并返回一个void指针 。 它所采用的void指针只是一种将参数传递给start_routine的方法,我得到了那个部分,但是我不明白为什么函数会返回一个void指针? 什么代码甚至会注意到void指针?

glibc的fprintf()线程安全实现吗?

fprintf是线程安全的吗? glibc手册似乎说它是,但我的应用程序,使用单个调用fprintf()写入文件似乎是混合来自不同进程的部分写入。 编辑:为了澄清,有问题的程序是一个lighttpd插件,服务器正在运行多个工作线程。 查看该文件,一些写入混合在一起。 编辑2:我看到的问题似乎可能是由于lighttpd的“工作线程”实际上是单独的进程: http : //redmine.lighttpd.net/wiki/lighttpd/Docs : MultiProcessor 问题 通过在同一个套接字上运行2个或更多进程,您将获得更好的并发性,但是您必须注意一些缺点: mod_accesslog可能会创建损坏的访问日志,因为同一个文件打开两次并且未同步。 mod_status将有n个独立的计数器,每个进程一个。 mod_rrdtool将失败,因为它收到两次相同的时间戳。 mod_uploadprogress将不会显示正确的状态。

为多个信号设置单个信号处理器function的正确方法是什么?

Linux上用于设置可以处理具有相同function的多个POSIX信号的程序的最佳方法是什么? 例如,在我的代码中,我有一个处理程序函数,我希望在捕获信号时执行某些操作时通常会调用它: /* Exit handler function called by sigaction */ void exitHandler( int sig, siginfo_t *siginfo, void *ignore ) { printf(“*** Got %d signal from %d\n”, siginfo->si_signo, siginfo->si_pid); loopCounter=0; return; } 我已经设置了两个信号来捕获每个信号的单独sigaction调用: /* Set exit handler function for SIGUSR1 , SIGINT (ctrl+c) */ struct sigaction act; act.sa_flags = SA_SIGINFO; act.sa_sigaction = exitHandler; sigaction( SIGUSR1, &act, […]

是否有POSIXfunction来复制文件?

现在看一下OS函数,我发现在POSIX系统上你有C函数调用,如unlink()删除文件, link()创建文件的硬链接, symlink()创建符号文件, rename()移动文件,但是… copy()文件的函数在哪里? 我知道通常的方法是打开源文件,读取其内容,打开目标文件并将其转储到那里。 但是为什么我不能在以前的所有function中找到任何这样的效用函数?

如何在信号处理程序中使用“sigaltstack”?

有谁知道如何在真正的信号处理程序中使用sigaltstack ,一个简单但完整的代码可能对我很有帮助! 先感谢您!

用`fcntl`和`flock`锁定有什么区别?

我正在阅读几个小时,但无法理解这两个锁之间有什么区别 。 我唯一理解的是fcntl()锁提供了一个可以锁定特定字节的粒度锁,只有fcntl()支持NFS锁定。 据说差异在于它们的语义,它们在被dup()或fork()复制时如何表现,但我无法理解实践中的区别。 我的情况是我正在写一个基于fork()的服务器中的日志文件,其中每个分叉进程在发生某些事情时写入同一文件。 为什么我要使用flock() ,为什么我要使用fcntl()锁?

如何在C中获取目录的大小?

是否有一个POSIX函数可以给我一个目录(包括所有子文件夹)的大小,大致相当于“ du -s somepath ”?

编写插件系统?

经过几个小时的研究,我什么都没有,所以我向你们求助于希望找到解决方案的好人。 我将用c ++编写一个bot,并且在某些时候想为它创建一个插件系统。 现在我知道我可以为它编写脚本语言,但是,我知道可以只编写一个api并在运行时动态地将程序链接到该API。 我的问题是,我如何获得动态链接(就像hexchat的插件一样)? 是否有任何优雅的解决方案,或者至少是典型设计的理论?