Linux 当父进程有许多线程、套接字和IPC时,在分叉(子)进程内调用system()
我有一个有很多线程的程序。有些线程是TCP服务器。。。每台服务器触发新线程以处理任何新连接 在处理单个客户机的一个线程中,我调用fork()。子进程调用setpgid()(创建一个新组),然后调用system()(C/C++标准库的函数)。父进程不断进行naps(usleep()函数)并检查时间限制。如果在子进程从system()返回之前超过了时间限制,则父进程将杀死子进程 我使用的是:Linux(Ubuntu)、pthreads等等。除了C/C++标准库,什么都没有 我的问题:子进程上的所有线程和TCP套接字会发生什么情况?这些东西是从父进程继承的吗?子线程和父线程是否同时运行所有这些线程和TCP服务器?这对我来说毫无意义。。。当父进程杀死子进程时,套接字将只在子进程内部关闭,还是也在父进程中关闭 目前,我实际上正在使用exec()清理子进程的整个映像,但如果安全的话,我宁愿直接调用system()。文件描述符(又称fds),例如TCP套接字,是通过一个fork继承的。“后面”的文件或设备通常保持打开和可用状态,直到最后一个文件描述符在进程终止时关闭或关闭。因此,标记子对象不会影响与父对象共享的TCP套接字 但是,只有fork()线程在子线程中执行。不复制控件的其他线程。您的情况如下所示:Linux 当父进程有许多线程、套接字和IPC时,在分叉(子)进程内调用system(),linux,multithreading,sockets,unix,fork,Linux,Multithreading,Sockets,Unix,Fork,我有一个有很多线程的程序。有些线程是TCP服务器。。。每台服务器触发新线程以处理任何新连接 在处理单个客户机的一个线程中,我调用fork()。子进程调用setpgid()(创建一个新组),然后调用system()(C/C++标准库的函数)。父进程不断进行naps(usleep()函数)并检查时间限制。如果在子进程从system()返回之前超过了时间限制,则父进程将杀死子进程 我使用的是:Linux(Ubuntu)、pthreads等等。除了C/C++标准库,什么都没有 我的问题:子进程上的所有线
+-- PID 100 -------------+ # parent
| fds: 0, 1, 2, 3 ... N | # fds: stdin, stdout, stderr, socket ... socket
| threads: |
| 0 (main) |
| 1 (tcp server) |
| 2 (forky) ---------(fork(2))-+
| ... | |
| N (tcp server) | |
+------------------------+ |
|
|
+-- PID 101 -------------+ # child
| fds: 0, 1, 2, 3 ... N | # fds: inherited
| threads: |
| 0 (copy of forky) | # will exec() ?
+------------------------+
调用exec
将用一些文本的main()
替换PID 101进程映像(并关闭标记为FD\u CLOEXEC的任何文件描述符)。相反,调用系统(“whatever”)
可能会产生至少两个以上的进程:一个(孙子)子/bin/sh
和一个(曾孙)孙子“whatever”
混合线程、分叉和共享资源很容易让你感到困惑,特别是当像
system()。慢慢来,当你不需要时,明确地丢弃你不需要的资源,一次解决一件事。或者防止它们被继承,如果你有ioctl()
选项。@AndrewMedico,子映像。为了澄清@EJP的评论,ioctl(FIOCLEX)
(或其更便携的表亲,fcntl(FD_CLOEXEC)
)将关闭exec
上的描述符,但不会关闭fork上的描述符
s,子系统本身仍然会从父系统继承打开的fds。当Linux接收到TCP段时会发生什么?它同时转发给PID 100和PID 101?如果PID 101上只运行“forky副本”,PID 101将无法从任何TCP套接字捕获任何数据,对吗?但是,会吗?例如,如果“forky副本”具有文件描述符,可以调用accept()成功地处理TCP连接?就像,两个进程处理同一个TCP服务器!哦,我的天!但是,如果我不接触任何描述符或任何网络系统调用或PID 101中的任何内容,可以吗?我的系统运行良好…我只是担心将来的问题。PID 101的存在只是为了调用system()然后马上就死了。这就是为什么我叫退出(系统(cmd)),哈哈哈。