fork -- 10




200x200


问题 -- 如何在进程间共享互斥量一般的,我们使用互斥量用来做线程同步与资源锁定,让一个资源同时只能有一个线程可以访问,那么,如何让互斥量在多个进程间共享呢?将互斥量创建在共享内存

#技术帖    #进程间通信    #技术分享    #fork   

200x200


概述管道是 UNIX 系统 IPC 的最古老形式,所有的 UNIX 系统都支持这种通信机制,所以也是最常用的 IPC 形

#读书笔记    #技术帖    #linux    #unix   
worker 进程的批量创建 -- ngx_spawn_process// ngx_pid_t // ngx_spawn_process(ngx_cycle_t *cycle, ngx_spawn_proc_pt proc, void *data, // char *name, ngx_int_t respawn) // 创建子进程 {{{ ngx_pid_t ngx_spawn_process(ngx_cycle_t *cycle, ngx_spawn_proc_pt proc, void *data, char *name, ngx_int_t respawn) { u_long on; ngx_pid_t pid; ngx_int_t s; if (respawn >= 0) { s = respawn; } else { // 如果进程已退出,则使用该节点存储新的进程信息 for (s = 0; s < ngx_last_process; s++) { if (ngx_processes[s].pid == -1) { break; }
#技术帖    #linux    #socket    #龙潭书斋   

200x200


概述近日研读 nginx 源码,读到 daemon 进程的创建觉得守护进程的创建过程还是有很多地方需要注意的,所以单独拿出来写一篇博客 在Unix&n

#技术帖    #linux    #unix    #龙潭书斋   
外围设置// 创建PID文件,写入当前 pid if (ngx_create_pidfile(&ccf->pid, cycle->log) != NGX_OK) { return 1; } // 确认 cycle->log 是否可用 if (ngx_log_redirect_stderr(cycle) != NGX_OK) { return 1; } if (log->file->fd != ngx_stderr) { if (ngx_close_file(log->file->fd) == NGX_FILE_ERROR) { ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, ngx_close_file_n " built-in log failed"); } } 经过上述两个过程 -- 创建PID文件并写入PID、确认 cycle->log 可用,之后即可进入到 worker 进程的创建工作了master 进程核心工作 -- ngx_master_process_cycle这里我们先介绍 ngx_master_p
#技术帖    #龙潭书斋    #fork    #nginx   
概述实际上,GDB 没有对多进程程序调试提供直接支持。例如,使用GDB调试某个进程,如果该进程fork了子进程,GDB会继续调试该进程,子进程会不受干扰地运行下去。如果你事先在子进程代码里设定了断点,子进程会收到SIGTRAP信号并终止。那么该如何调试子进程呢?其实我们可以利用GDB的特点或者其他一些辅助手段来达到目的。此外,GDB 也在较新内核上加入一些多进程调试支持。follow-fork-mode 方法在2.5.60版Linux内核及以后,GDB对使用fork/vfork创建子进程的程序提供了follow-fork-mode选项来支持多进程调试。follow-fork-mode 的用法set follow-fork-mode [parent|child] parent: fork之后继续调试父进程,子进程不受影响。child: fork之后调试子进程,父进程不受影响。因此如果需要调试子进程,在启动gdb后:(gdb) set follow-fork-mode child 并在子进程代码设置断点。断开调试 -- detach-on-fork参数set detach-on-fork [on|off] on: 断开调试follow-fork-mode指定的进程。o
#技术帖    #linux    #unix    #c语言   
基本实现system 函数是由 fork 和 exec 函数实现的写了一个基本的实现:/* * file: system.c * author: 龙泉居士 * date: 2014-09-08 */ #include <stdio.h> #include <sys/wait.h> #include <unistd.h> int my_system(const char *cmd) { pid_t pid = fork(), son_pid; if (pid < 0) return -1; if (pid == 0) { son_pid = fork(); if (son_pid < 0 || (son_pid>0 && execl("/bin/sh", "sh", "-c", cmd, (char *)0) < 0)) return 127; } return pid; } int main() { pid_t pid = my_system("date"); printf("pid: %d\n", pid)
#读书笔记    #技术帖    #linux    #unix   
当多个进程都企图对共享数据进行某种处理,而最后的结果又取决于进程运行的顺序,则我们认为这发生了“竞争条件”,可以参考:进程间通信(IPC) 如果 fork 调用之后的某种逻辑显式或隐式地依赖于在 fork 之后是父进程先运行还是子进程先运行,那么 fork 函数很可能会引起竞争条件,因为通常情况下,我们不能预料哪一个进程先运行,即使知道哪个进程先运行,但那之后发生的事也依赖于系统负载及内核的调度算法 如下面的代码中/* * file: wait.c * author: 龙泉居士 * date: 2013-05-27 14:00 */ #include "../apue.2e/include/apue.h" #include <sys/wait.h> int main () { pid_t pid; if ((pid = fork()) < 0) err_sys ("fork error"); else if (pid == 0) { if ((pid = fork()) < 0) err_sys ("fork error"); else if (pid > 0)
#读书笔记    #技术帖    #龙潭书斋    #apue   
问题一发现在CGI中父进程和子进程不能同时读写,为什么会这样,在父进程完全不读写的情况下子进程读写没有问题 问题二这个问题因为另一个问题的启发,冥冥之中觉得应该可以解决,只是现在学识的不足,没有什么想法,另一个问题就是:#include <stdio.h> #include <stdlib.h> #include <unistd.h> int main () { printf ("please input the loop time:\n"); int t, i; scanf ("%d", &t); FILE *f; f = fopen("forkfile", "a"); for (i=0; i!=t; ++i) { fork(); fprintf (f, "-"); printf ("-"); } fclose(f); return 0; }  为了及时地释放资源,于是改了一下,改成了下面这样:#include <stdio.h> #incl
#技术帖    #c语言    #进程    #fork   
forkpid_t fork( void); 定义于 unistd.h 头文件中,在父进程中返回子进程ID,子进程中返回0,出错返回-1 fork函数用于创建子进程,fork被调用一次返回两次,分别在父进程中返回子进程ID,子进程中返回0,父进程除了在fork子进程时获得子进程的PID外,没有其他方法可以获得 其子进程的ID,因为没有相关的函数,而子进程只要调用getppid函数就可以获得其父进程的PID。子进程调用fork函数后,子进程是父进程的副本,子进程获得父进程数据空间、堆、栈的副本,父子进程并不共享这些空间部分,父子进程共享正文段,即机器指令部分。 e.g./* * file: fork.c * author: 龙泉居士 * date: 2012-09-11 16:49 */ #include "../apue.2e/include/apue.h" int glob = 6; char buf[] = "a write to stdout\n"; int main () { int var; pid_t pid; var = 88; if (write (STDOUT_FILENO, buf, sizeof(buf)-1) !
#读书笔记    #技术帖    #linux    #unix   



京ICP备15018585号