- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个程序,应该让两个进程交替执行某项任务。在子进程第五次执行其任务后,它必须销毁信号量,并且父进程应该因此而停止。
一开始这听起来相当简单,但我很难捕获 sem_wait()
函数的返回值。
这是我的文件:
#include "Part2Defs.h"
int main() {
FILE *fptr = 0;
sem_t *child = mmap(0, sizeof(sem_t), PROT_READ|PROT_WRITE,
MAP_SHARED|MAP_ANONYMOUS, -1, 0);
sem_t *parent = mmap(0, sizeof(sem_t), PROT_READ|PROT_WRITE,
MAP_SHARED|MAP_ANONYMOUS, -1, 0);
/* save the number that we'll be writing to the file */
int number = 1, removed = 0;
sem_init(child, 1, 1);
sem_init(parent, 1, 0);
fptr = fopen(BUFFER, "r+");
if(fptr == 0) {
printf("An error occurred while opening the file\n");
}
fprintf(fptr, "%d", number);
fclose(fptr);
int pID = fork();
if(pID == 0) {
/* do this FOREVER. */
while(1) {
/* I was hoping to get the return value here */
if(sem_wait(parent) == 0) {
/* open the file */
fptr = fopen(BUFFER, "r+");
printf("B. The number [] was modified by parent\n");
fclose(fptr);
sem_post(child);
}
else {
printf("--parent-- waiting for new number to be READ: Identifier removed");
}
}
return 0;
}
else if(pID > 0) {
/* make a counter to go from 0 to 5 */
int i = 0;
while(1) {
sem_wait(child);
if(i++ == 5) {
/* delete the semaphore */
sem_destroy(parent);
printf("Semaphore removed\n");
break;
}
/* open the file */
fptr = fopen(BUFFER, "r+");
printf("A. The number [] was modified by child\n");
fclose(fptr);
sem_post(parent);
}
return 0;
}
else {
printf("There was an error creating the fork.\n");
exit(1);
}
}
这是我的输出:
A. The number [] was modified by child
B. The number [] was modified by parent
A. The number [] was modified by child
B. The number [] was modified by parent
A. The number [] was modified by child
B. The number [] was modified by parent
A. The number [] was modified by child
B. The number [] was modified by parent
A. The number [] was modified by child
B. The number [] was modified by parent
Semaphore removed
这几乎正是我所希望的,除了父进程从未以包含错误的消息结束。
顺便说一句:这是家庭作业,但由于我缺乏声誉,据说我不被允许在自己的帖子上添加家庭作业标签。
最佳答案
http://man7.org/linux/man-pages/man3/sem_destroy.3.html :
“销毁其他进程或线程当前正在使用的信号量 阻塞(在 sem_wait(3) 中)会产生未定义的行为。”
我找到了一种方法,使用其中一个信号量作为标志来告诉父级何时完成。
#include "Part2Defs.h"
int main() {
FILE *fptr = 0;
sem_t *child = mmap(0, sizeof(sem_t), PROT_READ|PROT_WRITE,
MAP_SHARED|MAP_ANONYMOUS, -1, 0);
sem_t *parent = mmap(0, sizeof(sem_t), PROT_READ|PROT_WRITE,
MAP_SHARED|MAP_ANONYMOUS, -1, 0);
/* save the number that we'll be writing to the file */
int number = 1, removed = 0;
sem_init(child, 1, 0);
sem_init(parent, 1, 0);
fptr = fopen(BUFFER, "r+");
if(fptr == 0) {
printf("An error occurred while opening the file\n");
}
fprintf(fptr, "%d", number);
fclose(fptr);
int pID = fork();
if(pID == 0) {
/* do this FOREVER. */
while(1) {
sem_post(child);
sem_wait(parent);
if(!sem_trywait(child))
break;
/* open the file */
fptr = fopen(BUFFER, "r+");
printf("B. The number [] was modified by parent\n");
fflush(stdout);
fclose(fptr);
}
sem_destroy(child);
sem_destroy(parent);
printf("--parent-- waiting for new number to be READ: Identifier removed");
return 0;
}
else if(pID > 0) {
/* make a counter to go from 0 to 5 */
int i = 0;
while(1) {
sem_wait(child);
if(i++ == 5) {
sem_post(child);
sem_post(parent);
//Signal the parent that it's done by adding one to child.
printf("Semaphore removed\n");
break;
}
/* open the file */
fptr = fopen(BUFFER, "r+");
printf("A. The number [] was modified by child\n");
fflush(stdout);
fclose(fptr);
sem_post(parent);
}
return 0;
}
else {
printf("There was an error creating the fork.\n");
exit(1);
}
}
关于c - 如何获取sem_wait()的返回值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22339871/
我这里有一个相当奇怪的问题,或者我不知道它的工作方式,但是我有下面的程序可以正确创建信号量并第一次运行到最后。但是在 sem_wait 处出现 SEGFault,如果信号量已经存在。我在 64 位 F
跟进我之前的问题: Conditional wait with pthreads 我将代码更改为使用信号量而不是互斥锁和条件信号。但是,我似乎遇到了无法解释的情况。 这是摘要 function thr
我用 C 编写了一个通用队列,用于各种负载类型。它是一个阻塞队列,因此消费者线程将阻塞等待队列被生产者线程填充。 我已经使用 check 单独测试了队列代码,包括线程阻塞等待将值添加到队列的行为。所有
我有一个进程生成了几个子进程。它们都共享一个信号量。 在我的主程序中。 sem_t *sharedSem = sem_open(SHAREDSEM, O_CREAT, 0600, 4); // Ini
我真正想知道的是sem_wait()是否是“不忙等待”。如果线程在 sem_wait() 中等待其请求的资源,是否会浪费 CPU 周期。 最佳答案 通常,同步原语将线程添加到等待队列,然后将其置于 s
这是我的生产者和消费者问题的代码。它可以被编译,但是当我运行程序时它什么也不打印。我测试了程序,发现问题可能与 sem_wait() 有关。为什么程序可以编译但输出错误?谢谢。 int main(in
有什么办法可以让我在同一个互斥锁中拥有最多 10 个线程? 类似于 sem_wait() 的值 10。 编辑: 找到这个: 它是信号量的一个实现,使用了互斥量和条件变量。 typedef struct
我编写了这个创建子进程并在其中打印一些消息的简单程序: #include #include #include #include #include #include #include se
用 gcc 编译。我运行它来查看为什么我在其他程序中使用的信号量无法正常工作。我只是错误地使用了它们还是什么?即使信号量应该停止执行并导致死锁,每次都会输出该字符串,对吧? 代码如下: #includ
我正在使用 semaphore.h,如果 n 而不是只有一个插槽可用,我想获取一个信号量。 Posix 本身不提供这个。我该如何解决这个问题?我必须使用信号量,没有其他同步方法是可能的。 我正在考虑使
我正在使用命名信号量编写一个多进程程序,在主进程中我使用以下代码打开信号量 semaphore = sem_open("/msema",O_RDWR|O_CREAT|O_TRUNC,00777,1);
我在 Linux 中写了一个关于共享内存的简单项目。两个程序共享内存,一个是向其中写入字母,第二个是从中读取字母。我决定使用信号量以确保在读取新字母之前不会生成新字母。 问题是当 sem_wait(r
为什么 sem_wait 不能在信号处理程序中使用(特别是每个线程的 SIGSEGV 信号)?有人能给我一个应用程序崩溃的示例场景吗?我想 sem_wait 既是可重入又是线程安全,那么这里的问题是什
基本上,我的程序创建了 3 个线程。 “服务器”和 2 个“ worker ”。工作人员旨在对 1000 行文件(每个线程 500 个数字)中的 3 位正整数求和。在每个 worker 对自己的部分求
我有一个由多个 pthread 使用的队列结构。如果队列不为空,线程应该从队列中出队,然后做他们的工作。 我最初将其设置为 while 循环,其中线程使用 mutex_lock 检查队列是否为空。不幸
我正在开发一个项目,其中“学生”线程将使用信号量来唤醒“TA”线程。 我有一个名为 studentNeedsHelp_Sem 的信号量 我用 sem_init(&studentNeedsHelp_Se
static int res1 = 0; static int res2 = 0; static int res3 = 0; static int counter = 0; static sem_t
我正在做一个学校项目,我们必须制作一个多线程网络服务器。当我在我的信号量上调用 sem_wait 时遇到问题(应该初始化为 0 但似乎已经被 sem_post() 编辑为 1)。我得到一个 SIGAB
我发现 sem_post 和 sem_wait 的时间间隔至少有 50 微秒。 sem_t gSema; struct timeval gTv; void *run(void *arg) {
如果您有一个线程 (thread1) 在 sem_wait() 上阻塞,而另一个线程 (thread2) 使用 sem_destroy() 破坏了那个信号量,那么会发生什么到线程 1? A quick
我是一名优秀的程序员,十分优秀!