C语言中进程与信号量的通信
我正在写两个文件: 父.c带有父进程,子.c带有子进程。他们应该使用信号量进行同步。启动父进程(已编译)时,父进程将在子进程消息之后永远等待: 孩子们好了 神父C语言中进程与信号量的通信,c,synchronization,ipc,semaphore,C,Synchronization,Ipc,Semaphore,我正在写两个文件: 父.c带有父进程,子.c带有子进程。他们应该使用信号量进行同步。启动父进程(已编译)时,父进程将在子进程消息之后永远等待: 孩子们好了 神父 #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <errno.h> #include <sys/types.h> #include <sys/ipc.h> #include &l
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
typedef union _semun {
int val;
struct semid_ds *buf;
ushort *array;
} semun;
int initsem(key_t key){
int status = 0, semid;
semid = semget(key, 1, 0600 | IPC_CREAT | IPC_EXCL);
if(semid == -1){
if(errno == EEXIST){
semid = semget(key, 1, 0);
}
else{
semun arg;
arg.val = 1;
status = semctl(semid, 0, SETVAL, arg);
}
if(semid == -1 || status == -1){
perror("initsem failed\n");
return -1;
}
return (semid);
}
}
int waitSem(int semid) {
struct sembuf wait_buf;
wait_buf.sem_num = 0;
wait_buf.sem_op = -1;
if(semop(semid, &wait_buf, 1) == -1) {
perror("waitSem failed");
exit(1);
}
return(0);
}
int signalSem(int semid) {
struct sembuf signal_buf;
signal_buf.sem_num = 0;
signal_buf.sem_op = 1;
if(semop(semid, &signal_buf, 1) == -1) {
perror("signalSem failed");
exit(1);
}
return(0);
}
int main(){
pid_t pid;
key_t key;
int semid;
if(key = ftok("/home/user/Scrivania/test.txt", 'a') == -1){
perror("IPC error: ftok\n");
exit(1);
}
else{
printf("Ftok done\n");
}
semid = initsem(key);
pid = fork();
if(pid < 0){
printf("failed fork()\n");
}
else if(pid == 0){
printf("Child process with PID: %d\n", pid);
execl("/home/user/Desktop/son", "son", "",(char *)0);
}
else{
printf("Father process with PID: %d\n", pid);
printf("Waiting for my son\n");
waitSem(semid);
printf("My son has done\n");
signalSem(semid);
}
return 0;
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
类型定义联合体{
int-val;
结构semid_ds*buf;
ushort*阵列;
}塞蒙;
int initsem(键\u t键){
int status=0,semid;
semid=semget(键,10600 | IPC|u CREAT | IPC|u EXCL);
if(semid==-1){
if(errno==EEXIST){
semid=semget(键,1,0);
}
否则{
semun arg;
arg.val=1;
状态=semctl(semid,0,SETVAL,arg);
}
如果(semid=-1 | | status=-1){
perror(“初始化失败\n”);
返回-1;
}
返回(semid);
}
}
int waitSem(int semid){
结构sembuf wait_buf;
wait_buf.sem_num=0;
wait_buf.sem_op=-1;
if(semop(semid,&wait_buf,1)=-1){
perror(“waitSem失败”);
出口(1);
}
返回(0);
}
int signalSem(int semid){
结构信号;
信号_buf.sem_num=0;
信号_buf.sem_op=1;
if(semop(semid,&signal_buf,1)=-1){
perror(“signalSem失败”);
出口(1);
}
返回(0);
}
int main(){
pid_t pid;
钥匙(t)钥匙;;
int-semid;
如果(key=ftok(“/home/user/Scrivania/test.txt,'a')=-1){
perror(“IPC错误:ftok\n”);
出口(1);
}
否则{
printf(“Ftok done\n”);
}
semid=initsem(键);
pid=fork();
if(pid<0){
printf(“失败的fork()\n”);
}
否则如果(pid==0){
printf(“具有PID的子进程:%d\n”,PID);
execl(“/home/user/Desktop/son”、“son”、“char*)0);
}
否则{
printf(“带PID的父进程:%d\n”,PID);
printf(“等待我的儿子”);
waitSem(semid);
printf(“我的儿子已经做了”\n”);
signalSem(semid);
}
返回0;
}
儿子,c
#包括
#包括
#包括
#包括
#包括
#包括
#包括
类型定义联合体{
int-val;
结构semid_ds*buf;
ushort*阵列;
}塞蒙;
int initsem(键\u t键){
int status=0,semid;
semid=semget(图例10600,不包括IPC);
if(semid==-1){
if(errno==EEXIST){
semid=semget(键,1,0);
}
否则{
semun arg;
arg.val=1;
状态=semctl(semid,0,SETVAL,arg);
}
如果(semid=-1 | | status=-1){
perror(“初始化失败\n”);
返回-1;
}
返回(semid);
}
}
int waitSem(int semid){
结构sembuf wait_buf;
wait_buf.sem_num=0;
wait_buf.sem_op=-1;
if(semop(semid,&wait_buf,1)=-1){
perror(“waitSem失败”);
出口(1);
}
返回(0);
}
int signalSem(int semid){
结构信号;
信号_buf.sem_num=0;
信号_buf.sem_op=1;
if(semop(semid,&signal_buf,1)=-1){
perror(“signalSem失败”);
出口(1);
}
返回(0);
}
int main(){
pid_t pid;
钥匙(t)钥匙;;
int-semid;
如果(key=ftok(“/home/user/Desktop/test.txt,'a')=-1){
perror(“IPC错误:ftok\n”);
出口(1);
}
否则{
printf(“Ftok done\n”);
}
semid=initsem(键);
waitSem(semid);
printf(“预信号”);
signalSem(semid);
printf(“我的操作”);
返回0;
}
OT的可能重复:您不需要下划线来定义结构
/联合
,以下划线开头的单词将保留用于实现(typedef union semun{..}semun;
可以)。您的进程使用不同的键。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
typedef union _semun {
int val;
struct semid_ds *buf;
ushort *array;
} semun;
int initsem(key_t key){
int status = 0, semid;
semid = semget(key, 1, 0600 | IPC_EXCL);
if(semid == -1){
if(errno == EEXIST){
semid = semget(key, 1, 0);
}
else{
semun arg;
arg.val = 1;
status = semctl(semid, 0, SETVAL, arg);
}
if(semid == -1 || status == -1){
perror("initsem failed\n");
return -1;
}
return (semid);
}
}
int waitSem(int semid) {
struct sembuf wait_buf;
wait_buf.sem_num = 0;
wait_buf.sem_op = -1;
if(semop(semid, &wait_buf, 1) == -1) {
perror("waitSem failed");
exit(1);
}
return(0);
}
int signalSem(int semid) {
struct sembuf signal_buf;
signal_buf.sem_num = 0;
signal_buf.sem_op = 1;
if(semop(semid, &signal_buf, 1) == -1) {
perror("signalSem failed");
exit(1);
}
return(0);
}
int main(){
pid_t pid;
key_t key;
int semid;
if(key = ftok("/home/user/Desktop/test.txt", 'a') == -1){
perror("IPC error: ftok\n");
exit(1);
}
else{
printf("Ftok done\n");
}
semid = initsem(key);
waitSem(semid);
printf("Pre signal\n");
signalSem(semid);
printf("My operation\n");
return 0;
}