Tag: fork

如何从子进程到父进程返回值?

我应该将斐波纳契系列的前12个项的总和从子进程返回到父进程,但是有377 ,父进程得到30976 。 #include #include #include #include #include int main(int argc, char *argv[]) { pid_t childpid; int i, fib_sum=0, fib1=1, fib2=1, temp, status; childpid=fork(); if(childpid!=0) { wait(&status); fprintf(stderr, “%d\n”, status); } else { for(i=1; i<=12; i++) { temp=fib1; fib_sum=fib1+fib2; fib1=fib_sum; fib2=temp; } fprintf(stderr, "%d\n", fib_sum); return fib_sum; } } 我究竟做错了什么?

在eclipse cdt中调试fork()

我正在尝试使用eclipse cdt(Juno)调试一些fork()机制。 我用C编写了程序。 if( -1 == (pid = fork()) ) /* error */ goto cleanup; else if ( 0 == pid ) /* child */ { execlp(“gcc”, “gcc”, cFilePath, “-o” , GCC_OUTPUT_FILE_NAME, NULL); goto cleanup; /* Arrives here only on error! */ } else if (pid > 0) /* parent – checks: correct pid returns, […]

为什么禁止在mac中使用fork而不使用exec?

我的问题很简单。 在Linux上,使用fork而不使用exec非常流行 但是,我发现在MacOS上这是不可能的(参见fork手册) https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man2/fork.2.html 您在子进程中可以做的事情是有限的。 为了完全安全,你应该自己限制自己只执行异步信号安全操作,直到调用其中一个exec函数为止。 除非明确记录为安全或异步信号安全,否则在fork()之后,应假定任何框架或库中的所有API(包括全局数据符号)都是不安全的。 如果您需要在子进程中使用这些框架,则必须执行。 在这种情况下,执行自己是合理的。 这对我来说很奇怪? 是什么原因? 有可能解决它吗?

C – exec是否必须在multithreading进程中立即执行fork?

情况:我有一个用C编写的multithreading程序。如果其中一个线程分叉,子进程被另一个用exec()替换,父进程等待子进程退出。 问题:在fork()创建子进程之后,有几行代码可以编译要在以下exec()命令中使用的参数。 假设我假设在由fork()创建的子进程和被exec()替换之间的时间内,子进程 – 作为父进程的副本 – 将具有父进程的所有线程,因此这些正确线程会运行 – 尽管只是很短的一段时间? 如果是这样,在fork()之后立即调用exec()的正确解决方案是什么?

解释这段代码的工作原理; 子进程如何返回值以及在哪里?

我不知道子进程返回的值是怎么回事? 输出为6,7; 问题来源: http : //www.cs.utexas.edu/~mwalfish/classes/s11-cs372h/hw/sol1.html Program 1: main() { val = 5; if(fork()) wait(&val); val++; printf(“%d\n”, val); return val; }

C – fork()和共享内存

我需要我的父进程和子进程才能读取和写入相同的变量(类型为int),因此它在两个进程之间是“全局的”。 我假设这会使用某种跨进程通信,并且在一个进程上有一个变量正在更新。 我做了一个快速谷歌和IPC和各种技术出现,但我不知道哪个是最适合我的情况。 那么什么技术是最好的,你可以提供一个链接到它的noobs教程。 谢谢。

捕获子进程的退出状态代码

我有一个函数,它分叉一个进程,复制输入和输出缓冲区的文件描述符,然后通过一个名为cmd的字符串传入的命令运行execl : static pid_t c2b_popen4(const char* cmd, int pin[2], int pout[2], int perr[2], int flags) { pid_t ret = fork(); if (ret < 0) { fprintf(stderr, "fork() failed!\n"); return ret; } else if (ret == 0) { /* Assign file descriptors to child pipes (not shown)… */ execl("/bin/sh", "/bin/sh", "-c", cmd, NULL); fprintf(stderr, "execl() failed!\n"); […]

用fork()共享堆内存

我正在使用C实现一个数据库服务器,它将处理来自多个客户端的请求。 为此,我使用fork()来处理各个客户端的连接。 服务器将数据存储在堆中,该数据包含一个指向动态分配记录的哈希表的根指针。 记录是具有指向各种数据类型的指针的结构。 我希望进程能够共享此数据,以便当客户端对堆进行更改时,其他客户端将看到更改。 我已经知道fork()使用COW(Copy On Write) ,我的理解是,当子进程尝试修改内存中的数据时,它将复制父进程的堆(和堆栈)内存。 我发现我可以使用shm库来共享内存。 – 是否足以共享数据库的根指针或是否必须将所有已分配的内存分享? – 如果孩子分配内存,父/其他孩子能够访问它吗? – 如果一个孩子分配内存并且后来被杀死,分配的内存是否仍然留在堆上? 那么例如下面的代码是一种共享堆内存的有效方式(在shared_string中)? 如果一个孩子使用类似的代码(即从//开始),其他孩子在孩子跑步和死亡之后能够读/写吗? key_t key; int shmid; key = ftok(“/tmp”,’R’); shmid = shmget(key, 1024, 0644 | IPC_CREAT); //start char * string; string = malloc(sizeof(char) * 10); strcpy(string, “a string”); char * shared_string; shared_string = shmat(shmid, string, 0); strcpy(shared_string, string);

如何在gdb中的fork()ed之间切换?

我正在调试这样一个多进程应用程序, 如何在fork() ed进程之间切换?

问叉()多个进程Unix

所以我有这个函数,分叉N个子进程。 然而,似乎分叉超过指定。 你能告诉我我做错了什么吗? 谢谢 void forkChildren(int nChildren){ int i; for(i = 1; i <= nChildren; i++){ pid = fork(); if(pid == 0) printf("I'm a child: %d PID: %d\n",i, getpid()); } } 主要是我打电话: forkChildren(5); 我期待以下输出: I’m a child: 1 PID: 2990 I’m a child: 2 PID: 2991 I’m a child: 3 PID: 2992 I’m a child: […]