fork 相关问题

`fork()`函数是通过复制调用进程来创建新进程的Unix / Linux / POSIX方法。

在 c 中使用 fork 的文件总行数

我的代码: char *文件名=“/home/septian/Documents/Repository.cs”; FILE *file = fopen(文件名, "r"); 如果(文件== NULL){ perror("文件打开失败"); 返回...

回答 1 投票 0

一个关于Linux中fork()和物理地址的奇怪问题

一位教授 Linux 的教授向他的学生发送了这个奇怪的问题...... 奇怪的是,这个程序将给出一个输出,其中父进程和子进程将获得相同的 phy...

回答 1 投票 0

fork()和pipe()

我需要此示例应用程序的帮助。当我运行它时,它在子进程打印“Child Sending!”后卡住了。 #包括 #包括 #包括 我需要此示例应用程序的帮助。当我运行它时,它在子进程打印“Child Sending!”后卡住了。 #include <stdio.h> #include <unistd.h> #include <sys/types.h> #include <stdlib.h> #include <string.h> #define INPUT 0 #define OUTPUT 1 int main() { int fd1[2]; int fd2[2]; int pid; if (pipe(fd1) < 0) exit(1); if (pipe(fd2) < 0) exit(1); if ((pid = fork()) < 0) { perror("fork"); exit(1); } else if (pid == 0) { close(fd1[INPUT]); close(fd2[OUTPUT]); char *str = "Hello World!"; printf("Child sending!\n"); write(fd1[OUTPUT], str, strlen(str)); char *bufferc = (char *)malloc(1000); char *readbufferc = (char *)malloc(80); int rdc; int gotdata = 0; while (gotdata == 0) while ((rdc = read(fd2[INPUT], readbufferc, sizeof(readbufferc))) > 0) { strncat(bufferc,readbufferc,rdc); gotdata = 1; } printf("Child received: %s",bufferc); free(readbufferc); free(bufferc); exit(0); } else { close(fd1[OUTPUT]); close(fd2[INPUT]); int rd; char *buffer = (char *)malloc(1000); char *readbuffer = (char *)malloc(80); int gd = 0; while (gd == 0) while ((rd = read(fd1[INPUT],readbuffer, sizeof(readbuffer))) > 0) { strncat(buffer, readbuffer,rd); gd = 1; } printf("Parent received: %s\n",buffer); free(readbuffer); printf("Parent sending!"); write(fd2[OUTPUT], buffer, strlen(buffer)); free(buffer); } return 0; } 顺便说一句,当我使用fork时,有没有办法进行调试,因为GDB会自动转到父进程? 子进程向父进程写入数据后,必须关闭管道的写入端,以便父进程知道它已达到 EOF。 您的代码中有很多错误。为什么使用 fd2 而不初始化它?去掉它。 现在它陷入了“子发送”状态,因为管道读取是一个阻塞调用,并且您将其放入一个永远不会返回的 while 循环中。请参阅管道的手册页。 如果您想中断 while 循环,请关闭该管道的所有写入端。 还要调试子进程,请在调试时调用 fork() 之前使用 gdb 命令 follow-fork-mode 作为子进程。 有几处错误: fd2 只是从未初始化过。 家长永远不会退出这个: while ((rd = read(fd1[INPUT],readbuffer, sizeof(readbuffer))) > 0) { strncat(buffer, readbuffer,rd); gd = 1; } 如果没有数据要读取,read将会阻塞并且不返回。唯一让它退出的是连接被关闭并且子进程没有关闭它。 您调用 read() 的期望是,如果没有任何内容可读取,它将返回读取的零字节。然而,您所看到的是因为 read() 在返回之前正在等待一些数据。要解决此问题,您需要执行以下两件事之一: 将套接字设置为执行非阻塞读取(不推荐) 读取之前先用select()或poll()查看是否有数据需要读取 还有其他几点: 不要投射 malloc() 的回报 检查 malloc() 是否不返回 NULL 将整个 gotdata 内容替换为 break 指令

回答 4 投票 0

如何在pytest中允许子进程?

当运行调用 os.fork 然后调用 sys.exit 的测试用例时,pytest 将捕获新进程中产生的 SystemExit 异常,并将相关测试用例标记为失败: > 系统.ex...

回答 1 投票 0

一个程序在循环中调用 fork 并进行 N 次迭代,会创建多少个进程?

#包括 #包括 int main() { 整数我; 对于(i=0;i<4;i++) fork(); return 0; } my question:Include the initial parent process, how many processes

回答 8 投票 0

C 上的石头、剪刀、布,使用 fork() 和 pipe()

我有一个课堂练习,这是练习: 练习 2. 用 C++ 编写一个名为“Game”的类,该类执行以下操作: 创建一个子进程负责随机返回“...

回答 1 投票 0

如何在 C 中处理管道中的 n 个命令?

所以我有一个任务,我必须处理管道中的 n 个命令。这些命令基于 Linux。如果我的理解是正确的,我知道我必须创建一个 for 循环,连续 for...

回答 1 投票 0

在 Eclipse cdt 中调试 fork()

我正在尝试使用 eclipse cdt (Juno) 调试一些 fork() 机制。 我用C写了这个程序。 if( -1 == (pid = fork()) ) /* 错误 */ 转到清理; else if ( 0 == pid ) /* 子进程 */ { 电子...

回答 4 投票 0

导入 Github 中的现有存储库时出错

我正在尝试将一个存储库导入到 GITHUB 中的另一个存储库中。我按照以下步骤操作。 复制克隆存储库的 HTTPS url 转到新的存储库并单击导入存储库,进入 onld

回答 1 投票 0

c++ write()/read() 缓冲区类型不起作用

我正在 Visual Studio Code 中使用 C++ 中的叉子和管道编写一个项目,当我编写代码时 int 临时性; 写(fds[1],temptotal,sizeof(int)); 或者 读取(fds [0],temptotal,sizeof(int)); 我明白了...

回答 1 投票 0

Printf语句不输出

我对 C 还比较陌生,我目前正在尝试编写一个并发进程程序,但是每当我到达子进程时,它只打印出 Printf 语句的一部分,如下所示...

回答 1 投票 0

将 GitHub 项目的分支发布到新的 NPM 模块,但保留与原始项目合并的选项?

GitHub 和 NPM 上存在高质量的开源存储库,拥有广泛的用户基础。 我已经分叉了这个项目并进行了实质性的扩展。我认为已经准备好合并回来了。但是(适当地)它...

回答 3 投票 0

为什么子进程继承的线程处于停止状态,而父进程却处于启动状态?

安全分叉多线程进程是有问题的 我正在学习使用多处理模块。现在我关注的是下面这句话: 请注意,安全分叉多线程进程是

回答 1 投票 0

在fork()系统调用中,如何保证父进程先执行?

我正在大学学习操作系统课程。 有多种方法可以使用 wait() 系统调用和 vfork() 确保子级首先执行(在父级之前)。 但我没有找到保证家长的方法

回答 1 投票 0

如何通过 GitHub Web 界面从 GitHub 上游分叉额外分支? (→不是通过 Linux 命令行)

我只分叉了一个开源项目的主分支。 GitHub 允许我使用其 Web 界面方便地重新同步我的分叉分支。 但我需要从 or 中取出另一个分支...

回答 1 投票 0

使用共享内存的服务器-客户端模型

我有以下程序,但无法使其在客户端和服务器之间正确同步。 运行后,我的程序总是以客户端和服务器之间的冲突而告终,试图...

回答 1 投票 0

gcc __thread 局部变量在多线程程序中使用 fork()

我在 X86 RHEL 8 和 gcc 8.5 上使用“常规 C”程序。 (尽管我可能会转向 RHEL 9)。 如果我有一个使用一些“__thread”全局变量的多线程程序,以及来自 t 的线程...

回答 1 投票 0

理解函数内部的 fork()

嗨,我下面有一个函数,其中函数内有一个 fork() 。我可以简单地执行 if else 操作,但从增量行为中我无法理解如何手动获取输出。 #在...

回答 1 投票 0

父进程能查到子进程的PID吗

我有一些可以分叉的Python代码 尝试: pid = os.fork() 如果 pid > 0: # 父进程,返回并继续运行 返回 除了: 打印(“异常”) 系统.ex...

回答 2 投票 0

既然我们在 if 中将 int 的值更改为 10,为什么在子进程及其创建的子进程的第二个 fork 后,我会得到 33 ?

这是代码: int main(int argc, char *argv[ ]){ 整数x = 33; 如果(!fork()){ 整数x = 10; printf("%d “, X); } 叉(); printf("%d “, X);

回答 2 投票 0

© www.soinside.com 2019 - 2024. All rights reserved.