草庐IT

c - 限制并发线程的数量(使用 pthreads)

我必须编写一个使用CURL在Web上发布信息的C应用程序。应用程序必须最多并行运行N(比方说10)个请求。我如何等待任何线程完成,而不是使用pthread_join()的特定线程。我阅读了有关pthread_cond_wait的内容,但大多数示例都是控制线程(主线程)如何唤醒工作线程。我需要的恰恰相反-工作线程必须能够在退出之前发出信号/唤醒父线程。更新:实际上我需要一种方法让管理线程休眠,当工作线程完成它的工作时,它应该唤醒管理线程以给它另一个工作。线程是否结束并为作业创建新线程或使用线程池并不重要。Threre仍然需要一种方式来向经理发出工作已完成的信号。我希望我没有得到这个建议:

c - 限制并发线程的数量(使用 pthreads)

我必须编写一个使用CURL在Web上发布信息的C应用程序。应用程序必须最多并行运行N(比方说10)个请求。我如何等待任何线程完成,而不是使用pthread_join()的特定线程。我阅读了有关pthread_cond_wait的内容,但大多数示例都是控制线程(主线程)如何唤醒工作线程。我需要的恰恰相反-工作线程必须能够在退出之前发出信号/唤醒父线程。更新:实际上我需要一种方法让管理线程休眠,当工作线程完成它的工作时,它应该唤醒管理线程以给它另一个工作。线程是否结束并为作业创建新线程或使用线程池并不重要。Threre仍然需要一种方式来向经理发出工作已完成的信号。我希望我没有得到这个建议:

c - Linux 中另一个进程的重复文件描述符(没有 sendmsg)

我拥有的是进程ID和来自该进程的文件描述符。除了sendmsg之外,还有什么方法可以复制(或重新打开)该进程的文件描述符以供Linux中的另一个进程使用?Windows有用于此目的的DuplicateHandle,我想知道Linux上是否有类似的东西。 最佳答案 正如+vonbrand指出的那样,您可以只使用/proc//fd/.但是你不能只是“在那里写”,它不会产生任何烟花。它是一个特殊的符号链接(symboliclink),指向在pid为的进程中打开的文件。作为文件描述符.只需使用它来打开您进程中完全相同的文件即可。您不必担心原

c - Linux 中另一个进程的重复文件描述符(没有 sendmsg)

我拥有的是进程ID和来自该进程的文件描述符。除了sendmsg之外,还有什么方法可以复制(或重新打开)该进程的文件描述符以供Linux中的另一个进程使用?Windows有用于此目的的DuplicateHandle,我想知道Linux上是否有类似的东西。 最佳答案 正如+vonbrand指出的那样,您可以只使用/proc//fd/.但是你不能只是“在那里写”,它不会产生任何烟花。它是一个特殊的符号链接(symboliclink),指向在pid为的进程中打开的文件。作为文件描述符.只需使用它来打开您进程中完全相同的文件即可。您不必担心原

c - SIGIO 到达文件描述符,我没有设置它,当没有 IO 是可能的

我正在尝试在文件描述符上可以进行I/O时接收信号。该程序在不执行I/O时需要执行其他操作,因此不能使用select(2)。当我运行下面的示例代码时,它会尽可能快地从处理程序内部打印消息,即使标准输入上没有数据。更奇怪的是,siginfo_t结构中报告的文件描述符因运行而异。我只为stdin(fd0)设置它;为什么处理程序会报告任何其他值?有时我看到0,有时我看到1,大多数时候我看到'?',它表示0、1或2以外的值。这是在OpenSUSE12.3和Linux内核3.7.10-1.16上,但我看到在CentOS6.4及其库存内核上似乎出现了同样的问题。我在处理程序中使用写入,因为signa

c - SIGIO 到达文件描述符,我没有设置它,当没有 IO 是可能的

我正在尝试在文件描述符上可以进行I/O时接收信号。该程序在不执行I/O时需要执行其他操作,因此不能使用select(2)。当我运行下面的示例代码时,它会尽可能快地从处理程序内部打印消息,即使标准输入上没有数据。更奇怪的是,siginfo_t结构中报告的文件描述符因运行而异。我只为stdin(fd0)设置它;为什么处理程序会报告任何其他值?有时我看到0,有时我看到1,大多数时候我看到'?',它表示0、1或2以外的值。这是在OpenSUSE12.3和Linux内核3.7.10-1.16上,但我看到在CentOS6.4及其库存内核上似乎出现了同样的问题。我在处理程序中使用写入,因为signa

c - 管道的 self 实现,如何知道有多少进程对我的管道有文件描述符?

我需要自己实现一个管道,它将具有pipe()的常规管道功能,read(),write()和close().该管道旨在用作父进程与其子进程之间的通信channel,这意味着该程序将使用fork(),可能不止一次。我的想法是在pipe()函数中使用malloc来实现它,它将在close()函数中被释放,但是当fork命令发生时我最终会有多个进程将文件描述符保存到我的管道,这是我无法弄清楚的部分:我怎么知道fork()被调用了多少次以及有多少进程访问了我的管道?我如何防止关闭其对管道一端的访问的进程为所有其他管道关闭它?我如何确保关闭管道的最后一个进程将释放其内存?Update实际上它是用来

c - 管道的 self 实现,如何知道有多少进程对我的管道有文件描述符?

我需要自己实现一个管道,它将具有pipe()的常规管道功能,read(),write()和close().该管道旨在用作父进程与其子进程之间的通信channel,这意味着该程序将使用fork(),可能不止一次。我的想法是在pipe()函数中使用malloc来实现它,它将在close()函数中被释放,但是当fork命令发生时我最终会有多个进程将文件描述符保存到我的管道,这是我无法弄清楚的部分:我怎么知道fork()被调用了多少次以及有多少进程访问了我的管道?我如何防止关闭其对管道一端的访问的进程为所有其他管道关闭它?我如何确保关闭管道的最后一个进程将释放其内存?Update实际上它是用来

c - 从消息队列中读取(如果为空则非阻塞)

我正在写消息队列if(msgsnd(q,&msg,sizeof(message),slaves_list[to])==-1)阅读if(msgrcv(q,&msg,sizeof(message),id,0)==-1)但是如果这个队列是空的呢?如何检查?如果没有我想在循环中执行下一条指令 最佳答案 使用IPC_NOWAIT。来自documentation:If(msgflg&IPC_NOWAIT)isnon-zero,thecallingthreadwillreturnimmediatelywithareturnvalueof-1and

c - 从消息队列中读取(如果为空则非阻塞)

我正在写消息队列if(msgsnd(q,&msg,sizeof(message),slaves_list[to])==-1)阅读if(msgrcv(q,&msg,sizeof(message),id,0)==-1)但是如果这个队列是空的呢?如何检查?如果没有我想在循环中执行下一条指令 最佳答案 使用IPC_NOWAIT。来自documentation:If(msgflg&IPC_NOWAIT)isnon-zero,thecallingthreadwillreturnimmediatelywithareturnvalueof-1and