Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 当父进程有许多线程、套接字和IPC时,在分叉(子)进程内调用system()_Linux_Multithreading_Sockets_Unix_Fork - Fatal编程技术网

Linux 当父进程有许多线程、套接字和IPC时,在分叉(子)进程内调用system()

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++标准库,什么都没有 我的问题:子进程上的所有线

我有一个有很多线程的程序。有些线程是TCP服务器。。。每台服务器触发新线程以处理任何新连接

在处理单个客户机的一个线程中,我调用fork()。子进程调用setpgid()(创建一个新组),然后调用system()(C/C++标准库的函数)。父进程不断进行naps(usleep()函数)并检查时间限制。如果在子进程从system()返回之前超过了时间限制,则父进程将杀死子进程

我使用的是:Linux(Ubuntu)、pthreads等等。除了C/C++标准库,什么都没有

我的问题:子进程上的所有线程和TCP套接字会发生什么情况?这些东西是从父进程继承的吗?子线程和父线程是否同时运行所有这些线程和TCP服务器?这对我来说毫无意义。。。当父进程杀死子进程时,套接字将只在子进程内部关闭,还是也在父进程中关闭

目前,我实际上正在使用exec()清理子进程的整个映像,但如果安全的话,我宁愿直接调用system()。

文件描述符(又称fds),例如TCP套接字,是通过一个fork继承的。“后面”的文件或设备通常保持打开和可用状态,直到最后一个文件描述符在进程终止时关闭或关闭。因此,标记子对象不会影响与父对象共享的TCP套接字

但是,只有fork()线程在子线程中执行。不复制控件的其他线程。您的情况如下所示:

+-- 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)),哈哈哈。