【问题标题】:using semaphore.h in processes (NOT THREADS)在进程中使用 semaphore.h(不是线程)
【发布时间】:2013-06-20 11:54:17
【问题描述】:

我有这个代码:

#include <stdio.h>
#include <unistd.h>
#include <semaphore.h>
#include <sys/shm.h>
#include <sys/stat.h>
#include <sys/types.h>

int main(){
    int segment_n;
    int segment_sem;
    int *shared_n;
    sem_t *shared_sem;
    int pid_int;
    pid_t pid;

    segment_n = shmget(IPC_PRIVATE, sizeof(int), S_IRUSR | S_IWUSR);
    segment_sem = shmget(IPC_PRIVATE, sizeof(sem_t), S_IRUSR | S_IWUSR);
    shared_n = (int *)shmat(segment_n, NULL, 0);
    shared_sem = (sem_t *)shmat(segment_sem, NULL, 0);

    sem_init(shared_sem, 0, 0);

    scanf("%d", shared_n);

    pid = fork();
    if(pid < 0){
        return 1;
    } else if(pid == 0){
    pid_int = (int)getpid();
    if(pid_int > *shared_n){
        *shared_n = 1;
        }else if(pid_int == *shared_n){
            *shared_n = 0;
        } else {
            *shared_n = -1;
        }
        sem_post(shared_sem);
        return 0;
    } else {
        sem_wait(shared_sem);
        printf("returns: %d\n", *shared_n);
        return 0;
    }
    return 0;
}

程序创建一个子进程来验证 shared_n 中的数字是否是他自己的 pid 的 >、

问题是当我编译它时,它给了我这个输出: https://dl.dropboxusercontent.com/u/6701675/informatica/Istantanea%20-%2020062013%20-%2013%3A49%3A14.png

提前感谢您的帮助!

洛伦佐

【问题讨论】:

  • -pthread。即使您不使用 pthreads,您也需要该库来使用信号量函数。此外,您需要使用pshared != 0 创建信号量。
  • @Aneri 是的!非常感谢,这是正确答案!但是我在哪里可以找到那个解决方案?我在网上到处搜索..
  • 谷歌说sem_init library,你会得到这个链接linuxforums.org/forum/programming-scripting/…

标签: c process fork parent-child semaphore


【解决方案1】:

这是 Linux 吗? Linux manpage 表示您需要与 pthread 库链接。

gcc foo.c -o foo -pthread

【讨论】:

    【解决方案2】:

    你必须用 -pthread 链接文件

    "gcc -pthread processi_esame.c -o processi"

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-08-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-06
      • 2020-05-10
      相关资源
      最近更新 更多