Articles of 进程

内存分配失败,即使有足够的内存

我正在使用Linux(正好是Ubuntu 13.04),目前我有一个问题:为什么内存分配将失败,即使有足够的内存? 我今天写了一个简单的testing应用程序,在运行这个testing应用程序时遇到了这个问题 以下是我用来testing的代码片段: #include <stdio.h> #include <unistd.h> #include <list> #include <vector> #include <strings.h> using namespace std; unsigned short calcrc(unsigned char *ptr, int count) { unsigned short crc; unsigned char i; //high cpu-consumption code //implements CRC algorithm: Cylic //Redundancy code } void* CreateChild(void* param){ vector<unsigned char*> MemoryVector; pid_t PID = fork(); if (PID == 0){ […]

用于subprocess的SIGTSTP信号处理程序

所以我试图在subprocess中为SIGTSTP信号实现一个​​信号处理程序。 基本上我试图达到的是这样的: 启动subprocess 让父母等待subprocess 在subprocess上调用睡眠x秒。 在睡眠完成之前,我想发送一个Ctrl + Z信号。 这个信号应该停止subprocess,但恢复父进程。 父进程应该知道已经停止的进程的进程ID。 我运行它使用命令:./testsig sleep 10 这是我的代码到目前为止: #include<stdlib.h> #include<stdio.h> #include<signal.h> #include<string.h> volatile sig_atomic_t last_proc_stopped; volatile sig_atomic_t parent_proc_id; void handle_stp(int signum) { if(getpid()==parent_proc_id) { kill(parent_proc_id,SIGCONT); signal(SIGTSTP,handle_stp); } else { last_proc_stopped=getpid(); kill(parent_proc_id,SIGCONT); } } void main(int argc, char *argv[]) { int childid=0,status; signal(SIGTSTP,SIG_IGN); parent_proc_id=getpid(); childid=fork(); if(childid>=0) { if(childid==0)//child { signal(SIGTSTP,handle_stp); […]

有关Linux进程内存布局的问题

我正在谈论英特尔32位平台。 Linux内核版本2.6.31-14。 #include <stdio.h> #include <stdlib.h> int init_global_var = 10; /* Initialized global variable */ int global_var; /* Uninitialized global variable */ static int init_static_var = 20; /* Initialized static variable in global scope */ static int static_var; /* Uninitialized static variable in global scope */ int main(int argc, char **argv, char **envp) { static […]

为什么不for_each_process显示每个任务?

我试图循环通过/proc实用程序中的每一个进程,我正在写(内核模块在/fs/proc )。 问题是,我只看到根名称空间中的进程。 我试图从sched.h使用macrosfor_each_process 。 我可以在shell中键入ps并查看大量进程,但我的for_each_process循环没有看到它们。 是什么赋予了? 注意:我想知道它是否与rcu_read_lock ? 我害怕把一个rcu_read_lock ,我不知道它应该去哪里。 麻烦的是,我所阅读的文档似乎说,在一个可抢占的内核(我的是),睡在rcu_read_lock内是非法的。 我需要调用down_read(mmap_sem) ,我恐怕会睡觉。 那意味着我不能使用rcu_read_lock ?

将分叉的进程输出redirect到NULL

我需要创build一个函数,除其他外,产生一个subprocess。 我想传递给这个函数一个可选的文件描述符列表,以便根据用户的需要,subprocessinput/输出可以被redirect。 我已经看到数十人在讨论如何使用dup2来做到这一点,就像这样: if( pid < 0 ) // error forking. { //… } else if( pid != 0 ) // Parent process. { ret = waitpid( pid, &status, 0 ); return WEXITSTATUS( status ); } else // Child process. { dup2( fd, STDIN_FILENO ); // Clone passed file discriptor. close( fd ); // Close […]

用一个名字开始一个进程

基本上我想dynamic地启动一些可能会创build自己的subprocess的进程,也想杀死我刚刚创build的某个进程组。 我能想到的一种方式是用一个名字来启动进程(作为一个组来区分),然后用pkill来杀死它们的名字。 问题是如何开始一个名称的过程,以便我可以使用pkill杀死他们的名字? 我也接受其他解决scheme。

在linux下读写PIPE

在Linux中一个简单的多进程程序。 input一些数字,如./findPrime 10 20 30.该程序将创build3个subprocess,以找出2-10,10-20,20-30之间的所有素数。 一旦一个subprocessfind一个素数,它就会通过一个pipe道写“2是素数”并发送给父进程。 父母会将其打印在屏幕上。 这里的问题是,我使用了一个while循环来写入消息到pipe道中,并在父级使用另一个while循环来接收消息,但是使用下面的代码,它只显示第一条消息,所以我想知道什么是“我要怎么继续读下去? 我错过了吗? 非常感谢! char readBuffer[100]; char outBuffer[15]; int pids[argc]; int fd[2]; pipe(fd); for(i = 0; i < argc; i++) { if( i == 0) bottom = 2; else bottom = args[i – 1]; top = args[i]; pids[i] = fork(); if(pids[i] == 0) { printf("Child %d: bottom=%d, top=%d\n", getpid(), […]

与进程使用互斥/信号量

几乎所有我在线阅读的代码和教程都涉及到使用互斥体和信号量进行线程之间的同步。 它们可以用来同步进程吗? 我想写这样的代码: void compute_and_print() { // acquire mutex // critical section // release mutex } void main() { int pid = fork(); if ( pid == 0 ) { // do something compute_and_print(); } else { // do something compute_and_print(); } } 有人可以指向类似的代码吗? 我知道不同的进程有不同的地址空间,但是我不知道上面是不是地址空间,但是,互斥量是不是指向同一个内核对象呢?

subprocess的进程父ID与父进程的PID不同

我试图在Linux中使用fork()函数在C中使用多个进程,这是我的代码: p1 = fork(); if(p1 != 0){ p2 = fork(); } printf("My PID is %d\n",getpid()); printf("My parent PID is %d\n",getppid()); 现在让我们假设父进程ID是100,并且两个subprocess(p1,p2)ID是101和102,并且init进程PID将是0,我的预期输出是: My PID is 100 My parent PID is 0 My PID is 101 My parent PID is 100 My PID is 102 My parent PID is 100 相反,我看到不同的东西,两个subprocess具有相同的PPID,但第一个进程有一个不同的PID。 这里是我得到的示例输出: My PID is 3383 My […]

我是否应该担心一个进程中的进程接收信号的顺序?

我想通过向其中的进程发送SIGTERM来终止一个进程组。 这可以通过kill命令来完成,但我find的手册仅提供了有关其工作原理的详细信息: int kill(pid_t pid, int sig); … If pid is less than -1, then sig is sent to every process in the process group whose ID is -pid. 但是,信号按哪个顺序发送到组中的进程呢? 想象一下以下情况:在组中的主进程和从进程之间设置pipe道。 如果在处理kill(-pid)过程中从服务器被杀死,而主服务器仍然不处理,则主服务器可能会将此情况报告为内部故障(在收到有关该孩子死亡的通知后)。 但是,我希望所有进程都了解,这种终止是由其进程组以外的事情引起的。 我怎样才能避免这种困惑? 我应该做一些比单纯的kill(-pid,SIGTERM)吗? 或者是由操作系统的基础属性来解决,我不知道这些属性? 请注意,我无法修改组中进程的代码!