我只是希望我的主线程在退出之前等待任何和所有我的(p)线程完成.
由于不同的原因,线程出现了很多,我真的不想跟踪所有这些 - 我只是想知道它们什么时候都消失了.
wait()为子进程执行此操作,在没有子进程时返回ECHILD,但是等待(似乎没有)(p)线程.
我真的不想经历保存每个未完成线程列表的麻烦(因为它们来来去去),然后必须在每个线程上调用pthread_join.
有一个快速而肮脏的方法来做到这一点?
从我一直在阅读上由The Open Group网站上fcntl,open,read,和write,我得到的印象是,是否O_NONBLOCK被设置在一个文件描述符,因此非阻塞I/O是否使用与描述符,应该是一个属性该文件描述符而不是底层文件.作为文件描述符的属性意味着,例如,如果我复制文件描述符或打开另一个描述符到同一个文件,那么我可以使用阻塞I/O和一个非阻塞I/O与另一个.
然而,尝试使用FIFO,似乎不可能同时为FIFO提供阻塞I/O描述符和非阻塞I/O描述符(因此O_NONBLOCK设置是否是基础文件的属性[FIFO] ):
#include <errno.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(int argc, char **argv)
{
int fds[2];
if (pipe(fds) == -1) {
fprintf(stderr, "`pipe` failed.\n");
return EXIT_FAILURE;
}
int fd0_dup = dup(fds[0]);
if (fd0_dup <= STDERR_FILENO) {
fprintf(stderr, "Failed to duplicate the read end\n");
return EXIT_FAILURE;
}
if (fds[0] == fd0_dup) {
fprintf(stderr, "`fds[0]` should not equal `fd0_dup`.\n");
return EXIT_FAILURE;
}
if …Run Code Online (Sandbox Code Playgroud) 也许我只是错过了它,但是没有一个函数等同于文件描述符的fprintf,甚至是一种暂时在它们之间翻转的方法?
Windows 7中是否有可用的完整POSIX实现(我在考虑Windows Services for UNIX)?
它是否适用于每个版本的操作系统(似乎没有)?
它如何在以前的MS Windows POSIX实现中添加/改进或中断?
在哪里可以找到有关Windows 7中有关POSIX合规性的特定Microsoft方法和实现的更多信息?
我是否需要一个extern "C" {}块来在C++程序中包含标准C头.只考虑在C++中没有对应项的标准C头.
例如:
extern "C" {
#include <fcntl.h>
#include <unistd.h>
}
Run Code Online (Sandbox Code Playgroud) 如果我fork是子进程,并且子进程在父进程调用之前退出waitpid,那么设置的退出状态信息是否waitpid仍然有效?如果是的话,什么时候变得无效; 即,如何确保我可以调用waitpid子pid并在任意时间后继续获取有效的退出状态信息,以及如何"清理"(告诉操作系统我不再对退出感兴趣完成的子进程的状态信息)?
我正在玩下面的代码,似乎退出状态信息在孩子完成后至少几秒钟有效,但我不知道多长时间或如何通知操作系统我不会waitpid再次打电话:
#include <assert.h>
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
int main()
{
pid_t pid = fork();
if (pid < 0) {
fprintf(stderr, "Failed to fork\n");
return EXIT_FAILURE;
}
else if (pid == 0) { // code for child process
_exit(17);
}
else { // code for parent
sleep(3);
int status;
waitpid(pid, &status, 0);
waitpid(pid, &status, 0); // call `waitpid` again just to see if …Run Code Online (Sandbox Code Playgroud) 在使用POSIX消息队列时,我注意到文件系统上创建了一些文件,其名称是我创建队列.我的问题:
Q1.消息队列是否将硬盘上的消息排队,而不是RAM?
Q2.如果是这样,那么在实施中它是否应该非常慢,因为它涉及HardDisk?
编辑:
我在"Linux编程接口 "一书中读到了这一点:
在Linux上,POSIX消息队列在虚拟文件系统中实现为i节点,消息队列描述符和打开消息队列描述分别实现为文件描述符和打开文件描述.但是,这些是SUSv3不需要的实现细节,并且在某些其他UNIX实现上不适用.
即使它是VFS,它仍然存储在HardDisk上,对吧?
记住这些信息,现在有人可以评论第二个问题吗?(和/或第一个也有更多要添加的东西)
我写了一个简单的包装脚本,用于在失败时重复命令retry.py.但是,由于我想看到子命令的输出,我不得不拉一些pty技巧.这适用于像rsync这样的程序,但是像scp这样的其他程序会应用额外的测试来显示像进度表这样的东西.
scp代码有一个广泛的测试:
getpgrp() == tcgetpgrp(STDOUT_FILENO);
Run Code Online (Sandbox Code Playgroud)
当我运行包装器脚本时,这会失败.正如您在我的简单tty_test.c测试用例中看到的:
./tty_tests
isatty reports 1
pgrps are 13619 and 13619
Run Code Online (Sandbox Code Playgroud)
和:
./retry.py -v -- ./tty_tests
command is ['./tty_tests']
isatty reports 1
pgrps are 13614 and -1
child finished: rc = 0
Ran command 1 times
Run Code Online (Sandbox Code Playgroud)
我已经尝试使用tcsetpgrp(),最终作为pty fd的IOCTL,但这导致了ptys的-EINVAL.如果可能的话,我宁愿继续使用Python子进程机器,还是需要手动fork/execve'ing?
如果一个linux进程正在等待I/O(即它处于SLEEP状态)并且SIGKILL发出一个信号,那么在终止(STOPPED状态)时它会通过RUNNING还是READY状态?
换句话说,对于一个处理系统中断的过程,例如一个生成的系统中断SIGKILL是否需要通过RUNNING或READY状态?
知道在正常情况下一个进程可以处理来自内核的中断并且知道SIGKILL有一个非常矛盾的目的是杀死一个无响应的信号,我怀疑对被杀死的进程有多少控制权,如果有的话.