Tag: freebsd

pthreads锁定恢复

我正在研究一个multithreading网络服务器应用程序。 目前,我遇到了锁定恢复问题。 如果一个线程在持有锁时意外死亡,比如一个互斥锁,rwlock,自旋锁……等,是否有可能从另一个线程恢复锁,而不必进入锁结构本身并手动取消所有者的关联从锁。 我想不必去这个极端来清除它,因为这将使代码不可移植。 我试图通过在违规线程上执行pthread_kill并查看返回代码来强制更改锁定所有者。 但即使使用PTHREAD_MUTEX_ERRORCHECK的互斥锁类型属性,如果锁定线程已退出,我仍然无法从另一个线程获得对互斥锁的控制。 如果在线程挽救时更新某个内部表,这可能会出现问题,因为它最终会导致整个服务器应用程序停止。 我已广泛使用Google,即使在这里,我也会收到相互矛盾的信息。 我可以探索的任何建议或想法? 这是在使用clang-llvm编译器的FreeBSD 9.3上。

管道损坏错误

我在FTP实现中的打开的数据套接字上使用write()来发送文件。 但在写完一些数据之后,它已经悬挂了一段时间; 然后它返回Broken管道错误。 任何帮助都将非常感谢。 我的进程从一个buff读取数据包并写入套接字。 我注意到带宽增加的问题。 如果我增加了要处理的数据包的数量,那么问题就出现了。 我正在使用FreeBSD。 我使用两个线程一个读取数据包并写入缓冲区…第二个线程从缓冲区读取这些数据包并写入套接字。 谢谢你的帮助亚历山大

dlerror:FreeBSD 7.2上未定义的符号“_nss_cache_cycle_prevention_function”

我有一个ANSI C程序,使用传递RTLD_LAZY的dlopen()动态加载.so文件。 我收到 Undefined symbol “_nss_cache_cycle_prevention_function” 在FreeBSD 7.2中访问.so文件时发出警告。 nss_cache_cycle_prevention_function()不是我程序的function之一,我想必须来自FreeBSD。 这也可能是Linux上的问题,尽管我没有遇到问题。 我宁愿不将FreeBSD特定的头文件加载到我的程序中。 我想以便携方式包含此function或抑制这些警告。

子进程可以在没有父进程死亡的情况下吗?

杀 – 它会立即杀死这个过程吗? 我找到了答案,并为SIGCHLD设置了一个信号处理程序,并在该处理程序中引入了wait 。 这样,每当父进程终止子进程时,就会调用此处理程序并调用wait来获取子进程。 – 动机是清除进程表条目。 即使没有父进程死亡,我仍然会看到一些子进程持续几秒钟。 – 这怎么可能? 我通过ps看到这个。 准确地说ps -o user,pid,ppid,command -ax和greping for parent进程,子进程和defunct。

如何用kevent()替换select()以获得更高的性能?

来自Kqueue维基百科页面 : Kqueue在内核和用户空间之间提供高效的输入和输出事件管道。 因此,可以修改事件filter以及接收未决事件,同时每个主事件循环迭代仅使用对kevent(2)的单个系统调用。 这与较旧的传统轮询系统调用形成对比,例如poll(2)和select(2)效率较低,尤其是在对大量文件描述符上的事件进行轮询时 这听起来很不错。 我为我的服务器定位FreeBSD,我正在处理大量的网络套接字fd – 在它们上面使用select()并确定从哪里读取数据。 我宁愿使用kevent()调用来获得更高的性能,因为它就是它的用途! 我在这里阅读了关于FreeBSD的kevent的手册页,但它对我来说很神秘,我找不到解释它的好资源。 使用kevent替换select的一个例子可以解决我的问题,也可以帮助我更好地了解如何使用kevent()。

Mac OS和FreeBSD之间的fifos kqueue处理的区别?

我正在开发一个使用fifos for IPC的应用程序,并使用事件通知API(例如epoll或kqueue)来监视要读取的数据的fifos。 应用程序期望如果fifo的编写器终止,读者将通过事件通知API接收事件,允许读者注意到编写器终止。 我目前正在将此应用程序移植到macos中,并且我遇到了一些kqueue的奇怪行为。 我已经能够创建这种行为的再现者: #include #include #include #include #include #include #include #include #include #include static int child() { char child_fifo_path[64]; char parent_fifo_path[64]; printf(“Child %d\n”, getpid()); sprintf(child_fifo_path, “/tmp/child-%d”, getpid()); sprintf(parent_fifo_path, “/tmp/parent-%d”, getpid()); mkfifo(child_fifo_path, 0644); mkfifo(parent_fifo_path, 0644); int parent_fd = open(parent_fifo_path, O_RDONLY); if (parent_fd == -1) { perror(“open”); return EXIT_FAILURE; } unsigned char parent_val; read(parent_fd, […]

杀 – 它会立即杀死这个过程吗?

kill究竟做了什么? 我有一个父进程,它一个接一个地创建100个(作为示例)子进程。 在任何孩子的工作结束时,我用kill(pid_of_child, SIGKILL)杀死了孩子,我在ps输出中看不到。 但是如果父进程出现问题并且我从exit(1)进程exit(1) (此时只有1个子进程 – 我可以在ps查看),那时我看到很多 ppid是父进程pid的进程。 怎么可能? kill不完全杀死孩子的过程?

execve(“/ bin / sh”,0,0); 在管道里

我有以下示例程序: #include int main(int argc, char ** argv){ char buf[100]; printf(“Please enter your name: “); fflush(stdout); gets(buf); printf(“Hello \”%s\”\n”, buf); execve(“/bin/sh”, 0, 0); } 我和我在没有任何管道的情况下运行它应该工作并返回一个sh promt: bash$ ./a.out Please enter your name: warning: this program uses gets() which is unsafe. testName Hello “testName” $ exit bash$ 但这不适用于管道,我想我知道为什么会这样,但我无法找到解决方案。 示例运行波纹管。 bash$ echo -e “testName\npwd” | ./a.out Please […]

c,结构后面的函数定义

675 * Check the validity of an ACL for a file. 676 */ 677 int 678 ufs_aclcheck(ap) 679 struct vop_aclcheck_args /* { 680 struct vnode *vp; 681 acl_type_t type; 682 struct acl *aclp; 683 struct ucred *cred; 684 struct thread *td; 685 } */ *ap; 686 { 687 688 if ((ap->a_vp->v_mount->mnt_flag & (MNT_ACLS | MNT_NFS4ACLS)) […]

如何在FreeBSD中获取打开的posix共享内存段列表

在linux中,我可以通过获取/ dev / shm目录列表获得打开的posix共享内存段列表。 我如何以编程方式获取FreeBSD中所有打开的posix共享内存段的列表? 假设使用shm_open打开了段,我甚至不知道用作shm_open的第一个参数的名称的一部分。