对于我之前关于分段错误的问题,我得到了非常有用的答案.谢谢那些已经回复的人.
#include<stdio.h>
main()
{
printf("hello");
int pid = fork();
wait(NULL);
}
Run Code Online (Sandbox Code Playgroud)
输出:hellohello.
在此,子进程从头开始执行.如果我没有错,那么如果我把sem_open放在fork()之前程序是如何工作的(ref答案:prev questions)
我需要一个关于分段故障的清晰解释,这种故障偶尔发生而不是总是发生 为什么不总是...如果编码中有任何错误,那么它应该始终正确...?
如果我fork()用来生成子进程,那么一旦父进程终止,子进程会自动终止吗?或者必须编程吗?
我对fork进程有疑问.我有一个代码
int main(int c, char **v){
fork();
fork() && fork() || fork();
printf("Hello\t");
}
Run Code Online (Sandbox Code Playgroud)
据我说,上面代码的输出将是2 4 = 16次"Hello",因为每个fork创建它自己的两个副本,所以总体变成2*2*2*2哪些是16时间"Hello".但它不正确它给我输出的10次数你好.这里发生了什么?
在运行以下代码时:
#include <stdio.h>
#include <unistd.h>
static int x = 0;
int main(int argc, char *argv[])
{
pid_t p = getpid();
fork();
x++;
if (! fork()) {
x++;
if (fork()) {
x++;
}
}
printf("p%d: x = %d\n", getpid() - p, x);
sleep(60);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我得到以下输出:
p0: x = 1
p1: x = 1
p2: x = 3
p3: x = 3
p4: x = 2
p5: x = 2
Run Code Online (Sandbox Code Playgroud)
我不太明白这些值是如何以及在哪里增加的。的原始处理(P0)执行main()函数。第一个 fork() 创建一个 子进程 (p1)。然后,p0 和 p1 …
问题A:
鉴于下面的代码,我理解当你调用一个fork时,大多数情况下,如果它的资源被传递给子进程.现在,我所查找的几乎所有Fork示例都设置得像我所拥有的那样.从它的外观来看,我不明白如何调用父进程,因为它在else块中.
问题B:
执行子进程中的代码后,它是否自动知道它现在必须进入父进程?我在其他示例中也看到了等待(NULL),如果它将要进入else块,那等待的作用是什么.假设我想要执行同一父项的两个子进程,这两个是否并行运行,然后在完成后运行父代码?谢谢.
#include <stdio.h>
#include <unistd.h>
int main()
{
pid_t pid;
pid = fork();
if(pid == 0){
printf("Hello World");
}
else{
printf("Hello World");
}
return 0;
}
Run Code Online (Sandbox Code Playgroud) 好吧,我试图做一个简单的功能来不断改变它的PID,但我明白了:
error: ‘SIGKILL’ undeclared (first use in this function)
Run Code Online (Sandbox Code Playgroud)
这是我的代码:
#include <stdio.h>
int changePID(void) {
int pid = fork();
printf(pid);
sleep(3);
kill(pid, SIGKILL);
}
int main(void) {
while (1) {
changePID();
}
}
Run Code Online (Sandbox Code Playgroud) 所以我必须找到使用该fork()方法的代码的输出.我认为输出是5"你好",但我得到8.为什么?这是代码:
#include "csapp.h"
void doit()
{
Fork();
Fork();
printf("hello\n");
return;
}
int main()
{
doit();
printf("hello\n");
exit(0);
}
Run Code Online (Sandbox Code Playgroud) if(fork()=0)和之间有什么区别if(fork()==0)?
当它返回0时,它是孩子,但如果它是== 0怎么办?
我写了一个程序
#include <stdio.h>
#include <unistd.h>
int main()
{
int returnVal = fork();
printf("Return Value: %i\n", returnVal);
return 1;
}
Run Code Online (Sandbox Code Playgroud)
当我编译并运行时,我得到以下输出我只给出了一个printf语句然后为什么我看到2个打印.如果我删除了打印件,则不会打印任何内容.
alwin@alwin-desktop:~/Projects/Nix$ ./a.out
Return Value: 5547
Return Value: 0
Run Code Online (Sandbox Code Playgroud) 这是测试fork()系统调用的C代码:
#include<stdio.h>
#include<stdlib.h>
#include<sys/types.h>
#include<unistd.h>
#include<wait.h>
int main(int argc, char *argv[])
{
printf("I am: %d\n", (int)getpid());
pid_t pid = fork();
printf("fork returned: %d\n", (int)pid);
if (pid < 0)
{
perror("fork failed");
}
if (pid==0)
{
printf("I am the child with pid %d\n", (int)getpid());
sleep(5);
printf("Child exiting...\n");
exit(0);
}
printf("I am the parent with pid %d, waiting for the child\n", (int)getpid());
wait(NULL);
printf("Parent ending. \n");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
终端输出是:
I am: 25110
fork returned: 25111
I am the parent with pid …Run Code Online (Sandbox Code Playgroud) 我刚才有这样的想法,需要一个分叉版本的Firefox,它将提供开箱即用的Web开发工具.像FireBug,YSlow,FireCookie,LiveHTTPHeaders等.
也许fork应该只包含那些扩展,或者采取进一步措施并在现有的chrome中实现它们.
我正在考虑的原因是,现在我有两个Firefox配置文件.一个"浏览",只有一个扩展和一个"开发",有很多很多的扩展.显然优点是前者比后者快.也许如果从一开始就瞄准开发人员,分叉版本会带来一些速度改进和其他细节.
你怎么看?有志愿者吗?
我必须为这段代码绘制进程树:
int main ()
{
int i;
for(i = 0; i < 3; i++)
if(fork() > 0)
fork();
return 0;
}
Run Code Online (Sandbox Code Playgroud) 考虑到
C++11§1.10/ 24(在[intro.multithread]中)"实现可以假设任何线程最终将执行以下操作之一:
- 终止,
- 调用库I/O函数,
- 访问或修改易失性对象,或
- 执行同步操作或原子操作.
[注意:这是为了允许编译器转换,例如删除空循环,即使无法证明终止也是如此. - 尾注]
...是允许编译器优化掉以下循环的编译器:
int main(int argc, char* argv[]) {
while ( true )
fork();
}
Run Code Online (Sandbox Code Playgroud)
?
(有一些早期的讨论在(优化掉一个"while(1);"在C++ 0x中),但它似乎没有回答fork循环中调用的情况.)