Tag: fork

传统Linux fork-exec中使用_exit()和exit()之间有什么区别?

我一直在试图弄清楚在Linux内部如何使用fork-exec机制。 一切都按照计划进行,直到一些网页开始混淆我。 据说一个subprocess应该严格使用_exit()而不是简单的exit()或者main()的正常返回。 据我所知,Linuxshellfork-execs每一个外部命令; 假设我上面说的是真的,结论是这些外部命令和Linux shell内部发生的任何其他执行都不能正常返回! 维基百科和其他一些网页声称,我们必须使用_exit()只是为了防止subprocess删除父的临时文件,而可能的双重刷新stdio缓冲区可能会发生。 虽然我理解前者,但是我没有线索,双缓冲区的刷新对Linux系统是有害的。 我花了整整一天的时间…感谢您的任何澄清。

Bitbucket:更新一个分叉来合并主repo的变化?

我正在与一个bitbucket git回购我有只读访问,所以我创build了一个分支来处理我的function。 问题:如何更新我的分支以包含对所有者所做的原始回购所做的更改? 在github上,似乎有人要做以下的事情,所以我怀疑是这样的: $ git remote add upstream git://github.com/octocat/Spoon-Knife.git $ git fetch upstream $ git merge upstream/master 在Bitbucket文档中,我找不到任何有关此信息的信息

execv()和fork()的时间浪费

我目前正在学习有关fork()和execv() ,我有一个关于组合效率的问题。 我被显示了以下标准代码: pid = fork(); if(pid < 0){ //handle fork error } else if (pid == 0){ execv("son_prog", argv_son); //do father code 我知道fork()克隆整个进程(复制整个堆等), execv()用新程序replace当前的地址空间。 考虑到这一点,使用这种组合不是很低效吗? 我们正在复制一个进程的整个地址空间,然后立即覆盖它。 所以我的问题是: 即使我们有浪费,使用这个组合(而不是其他一些解决scheme)可以使人们仍然使用这个组合的优点是什么?

fork()如何知道何时返回0?

以下面的例子: int main(void) { pid_t pid; pid = fork(); if (pid == 0) ChildProcess(); else ParentProcess(); } 所以纠正我,如果我错了,一旦fork()执行一个subprocess创build。 现在通过这个答案 fork()返回两次。 这是一次为父进程,一次为subprocess。 这意味着两个独立的进程在fork调用期间生成,而不是在结束之后生成。 现在我不明白它如何理解如何为subprocess返回0和为父进程正确的PID。 这在哪里变得非常混乱。 这个答案指出fork()通过复制进程的上下文信息并手动将返回值设置为0来工作。 首先我正确地说,返回任何函数都放在一个寄存器中? 由于在单个处理器环境中,一个进程只能调用一个只返回一个值的子例程(如果我在这里错了,请纠正我)。 比方说,我在一个例程中调用一个函数foo(),该函数返回一个值,该值将被存储在一个寄存器中,比如BAR。 每次函数想要返回一个值,它都将使用一个特定的处理器寄存器。 所以,如果我能够手动更改过程块中的返回值,我可以更改返回到该function的值? 所以我正确地认为fork()是如何工作的?

为什么C-forkbombs不能像bash那样工作?

如果我运行古典bash forkbomb: :(){ :&:&};: 我的系统在几秒钟后挂起 。 我试图在C中写一个forkbomb,这里是代码: #include <unistd.h> int main( ) { while(1) { fork(); } return 0; } 当我运行它时,系统的响应速度会变慢,但是我可以按^C来杀死这个进程(即使在几分钟之后)。 上面的代码与我发布的原始bash forkbomb不同:它更像是: 🙁 ) { while true do : done } (我没有testing,不知道是否会挂起系统)。 所以我也试图实现原来的版本; 这里的代码是: #include <unistd.h> inline void colon( const char *path ) { pid_t pid = fork( ); if( pid == 0 ) […]

Linux系统和exec之间的区别?

system和exec系列命令有什么区别? 特别是我想知道他们中的哪一个创造了孩子的工作过程?

fork()和输出

我有一个简单的程序: int main() { std::cout << " Hello World"; fork(); } 程序执行后我的输出是: Hello World Hello World 。 为什么这会发生,而不是一个单一的Hello world ? 我猜测subprocess是在幕后重新运行的,输出缓冲区是在进程之间共享的,或者是沿着这些线的东西,但是这种情况还是发生了什么?

fork:重试:资源暂时不可用

我尝试在我的计算机上安装英特尔MPI基准testing,并收到错误消息: fork: retry: Resource temporarily unavailable 然后,当我运行ls和top命令时,再次收到此错误。 什么是造成这个错误? configuration我的机器: Dell precision T7500 Scientific Linux release 6.2 (Carbon)

从线内分叉是否安全?

让我解释一下:我已经在Linux上开发了一个应用程序,它分叉和执行外部二进制文件并等待它完成。 结果由fork +进程独有的shm文件传递。 整个代码封装在一个类中。 现在我正在考虑线程化,以加快速度。 拥有许多不同的类函数实例,并发地(使用不同的参数)分离和执行二进制文件,并与其自己的独特的shm文件进行通信。 这个线程安全吗? 如果我在一个线程内分叉,除了安全之外,还有什么我需要注意的吗? 任何意见或帮助,非常感谢!

从长时间运行的进程中以不同的用户身份运行subprocess

我有一个长期运行的守护进程的Python进程,它在某些事件发生时使用subprocess产生新的subprocess。 长时间运行的过程由拥有超级用户权限的用户启动。 我需要subprocess产生作为不同的用户(例如“nobody”)运行,同时保留父进程的超级用户权限。 我目前正在使用 su -m nobody -c <program to execute as a child> 但这似乎重量级,并不会很干净地死去。 有没有办法做到这一点编程而不是使用苏? 我正在查看os.set * uid方法,但是Python std lib中的文档在该区域相当稀疏。