c - 在进程(不是线程)中使用 semaphore.h

标签 c process fork parent-child semaphore

我有这个代码:

#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,然后分别写入shared_n 1、-1或0。

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

预先感谢您的帮助!

洛伦佐

最佳答案

这是Linux吗? Linux manpage说你需要链接 pthread 库。

gcc foo.c -o foo -pthread

关于c - 在进程(不是线程)中使用 semaphore.h,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17212976/

相关文章:

c++ - 为什么我在安装软件包时收到这样的错误消息?

c - 如何使用 C 中的基本命令将数字转换为单词

c - Linux下动态加载库的地址范围

c - 使用并行算法进行求和减少 - 与 CPU 版本相比性能较差

c - 填充船战游戏板C

linux - 如何确保正在运行的进程是我期望正在运行的进程?

process - 更改另一个进程区域设置

c++ - 没有从管道中获取所有线路

C:将 stdin、stdout 重定向到管道

c - 如果子进程在读取时不关闭管道,会发生什么情况?