Articles of fork

在linux中创buildsubprocess并处理可能失败的最佳方法

我有父母的过程,必须创造less数儿童进程。 我发现最好的方法是使用fork + execl 。 但是父进程需要知道具体孩子的execl是否失败,我不知道如何实现。 int pid = fork(); if (pid < 0) { std::cout << "ERROR on fork." << std::endl; } if (pid == 0) { execl("/my/program/full/path", (char *)NULL); exit(1); } else { if (/*child's process execl fails*/) { std::cout << "it failed" << std::endl } else { std::cout << "child born" << […]

Linux – 如何更改C中分叉进程的信息

标题可能听起来有点奇怪,我看到ps aux : root 20953 0.0 0.0 9528 1280 ? Ss Apr28 0:07 sendmail: accepting connections 其中“接受连接”就像是sendmail进程的标题。 这不是一个参数,因为cat /proc/20953/cmdline返回sendmail: accepting connections (空间而不是0x00): # cat /proc/20953/cmdline |hexdump -C 00000000 73 65 6e 64 6d 61 69 6c 3a 20 61 63 63 65 70 74 |sendmail: accept| 00000010 69 6e 67 20 63 6f 6e 6e […]

没有这样的过程 – ptrace

问题陈述 :一个程序C由一个循环组成。 这个程序的执行必须由另一个进程来控制,这个进程会周期性地显示受控进程的进程。 kill(pid, SIGSTOP),函数ptrace(PTRACE_PEEKTEXT,pid,…)不会再findC进程。 从我所读到的, ptrace(PTRACE_PEEKTEXT,pid,… )应该在由pid标识的进程停止时工作。 我不知道我错过了什么,所以任何帮助将不胜感激。 以下是我迄今为止所做的: 有两个进程, P和C. 第一个进程(P)通过fork()创build第二个进程(C ) 。 C的代码是这样的: int i = 0; int main() { ptrace(PTRACE_TRACEME, 0, NULL, NULL); printf("Memory address = %p", (void *)&i); while(1) { i++;} } P的代码如下: {…} switch (pid = fork()) { case 0: /* the child */ if (execl("C", "", (char *) […]

当一个进程分叉时,共享库.so仍然在地址空间中吗? 那构造函数会被再次执行吗?

当进程分叉时,subprocess是否在其地址空间中拥有自定义的共享库(.so文件)? 如果是这样,共享库的地址是否与其父进程相同或不同(由于ASLR)? 在主函数__attribute__ ((constructor)) constructor函数之前运行的函数是否会在所有subprocess中再次执行? 什么线程?

为什么execvp()使用fork()执行两次?

我正在实现一个shell。 当尝试执行除了改变目录以外的命令时, execvp()运行,子程序终止,并创build一个新的子程序。 当我改变目录时,孩子不会终止,并创build一个新的孩子。 这是我的代码示例: for(;;) { printf("bash: "); parse(); … pid_t pid = fork() if (pid == 0) if (!strcmp(line[0], "cd")) if (!line[1]) (void) chdir(getenv("HOME")); else (void) chdir(line[1]); else execvp(line[0], line); … if (pid > 0) { while (pid == wait(NULL)); printf("%d terminated.\n", pid); } } cd ../; ls; 运行正确,除了我必须Ctrl+D两次结束程序。 虽然,如果我input相同的信息(即mybash < chdirtest ),它会正确运行一次,终止子mybash […]

fork()和scanf()如何一起工作?

我试图看看,如果我从键盘读取的东西,而我有多个进程与fork()(在我的情况下,有两个孩子和父母),我发现了以下问题会发生什么:我需要告诉父母等待孩子的进程,否则程序performance奇怪。 我做了一个研究,发现问题出在父母身上,他需要等待孩子的过程结束,因为如果父母的过程首先结束,那么他会closuresSTDIN,对吗? 但是我也发现每个进程都有一个STDIN的副本,所以我的问题是: 为什么它这样工作,为什么只有父母有STDIN和孩子没有问题,我的意思是为什么如果孩子的过程首先结束不影响STDIN,但如果父母的过程首先结束,它会影响STDIN? 这是我的testing: 我没有等待()运行程序,并input一个数字后,程序停止,但后来我再次input两次,另外两个来自printf()的消息出现。 当我用wait()运行程序时,一切正常,每个进程分别调用scanf()并读取一个不同的数字。

C ++ Boost线程睡眠死锁

我有以下代码的问题: #include <boost/thread/thread.hpp> #include <boost/thread/mutex.hpp> #include <iostream> #include <sys/types.h> #include <sys/wait.h> using namespace std; void f1(uint count) { while(count– > 0) { // boost::this_thread::sleep(boost::posix_time::millisec(1000)); sleep(1); } } void folkflore() { int res = fork(); //parent if ( res ) { wait(NULL); } else { unsigned int x = 2; boost::thread tx(boost::bind(f1, 2)); tx.join(); _exit(-5); } […]

为什么glibc没有使用fork来实现sys_fork?

在eglibc的nptl/sysdeps/unix/sysv/linux/i386/fork.c有一个定义: #define ARCH_FORK() \ INLINE_SYSCALL (clone, 5, \ CLONE_CHILD_SETTID | CLONE_CHILD_CLEARTID | SIGCHLD, 0, \ NULL, NULL, &THREAD_SELF->tid) 这在实际的__libc_fork()用作实现的核心。 但是,例如在Linux的arch/x86/entry/syscalls/syscall_32.tbl存在一个sys_fork条目,以及在syscalls_64.tbl 。 所以Linux显然有它的fork特殊系统调用。 所以现在我想知道:为什么glibc在clone方面实现fork() ,如果内核已经提供了fork系统调用?

拨号后呼叫信号

“代码清单1”和“代码清单2”是否有区别? 因为在代码清单1中,subprocess能够捕获SIGTERM信号并很好地退出。 但是代码列表2在SIGTERM信号上突然终止。 我正在使用Linux和C. 代码清单1 if (signal(SIGTERM, stopChild) == SIG_ERR) { printf("Could not attach signal handler\n"); return EXIT_FAILURE; } pid = fork(); 代码清单2 pid = fork(); if (signal(SIGTERM, stopChild) == SIG_ERR) { printf("Could not attach signal handler\n"); return EXIT_FAILURE; } 奇怪的是, 在代码清单2中,subprocess和父进程都设置了SIGTERM的信号处理程序 。 所以,这应该是工作。 不是吗?

重载fork()

我重载了fork()系统调用,并使用RTLD_NEXT创build了我自己的fork()版本。 也就是dlsym(RTLD_NEXT, fork) 。 这将打我的版本的叉子。 在这之后,我想复制实际fork()系统调用的任务,即创buildsubprocess并返回pid,以及一些更多的附加function。 我无法弄清楚如何做到这一点。 我检查了fork() (fork.c)的内核源代码,并没有弄清楚。 这样做: dlsym(RTLD_NEXT,fork); int fork(void) { int pid=_fork(); // Trying to call actual fork does not work return pid; } 我怎样才能做到这一点? 这里是fork的内核源代码链接: http : //lxr.linux.no/linux+v2.6.32/kernel/fork.c#L10 编辑(从评论拉入) : 我正在使用泄漏检测工具,并且此子工具在subprocess删除由父级分配的内存时检测到双重空闲。 为了克服这个,我将重写fork() ,并且每当有一个fork() ,父级的内存分配表将被复制到子级。