IPC#RMID在使用C++; 我正在努力解决C++中的学校项目。我必须创建15个进程,它们必须按顺序运行,这意味着进程按顺序运行01 2 3 4 5 6 7 8 9 10 11 12 14 0。它可以工作,但是当我试图从内存中删除信号量时,我从semctl中得到了错误。最后,我使用了“semctl(semid,0,IPC_RMID,0)”,但我得到了错误22,这意味着EINVAL,但它没有意义,我尝试从parrent进程中删除信号量,所以我应该有权限这样做 #include <stdio.h> #include <unistd.h> #include <sys/types.h> #include <sys/ipc.h> #include <sys/sem.h> #include <errno.h> #include <sys/wait.h> union semun { int val; struct semid_ds *buf; ushort *array; }; struct sembuf sops[1]; int semid; int wait_sem(int index, int pid){ fprintf(stderr, "\n------- Proces %d do operation wait (-1) on semaphore %d\n",pid, index); sops[0].sem_num = index; sops[0].sem_op = -1; sops[0].sem_flg = 0 ; if (semop(semid, sops, 1)<0){ perror("semop fail wait"); return 1; } else return 0; } int signal_sem(int index, int pid){ fprintf(stderr, "\n++++++ Proces %d vykonava operaciu signal (1) na semafore %d\n",pid,index); sops[0].sem_num = index; sops[0].sem_op = 1; sops[0].sem_flg = 0; if (semop(semid, sops, 1)<0){ perror("semop fail signal"); return 1; } else return 0; } void createSem(key_t paKey, int paSemFlg, int paNsems) { printf ("uid=%d euid=%d\n", (int) getuid (), (int) geteuid ()); (semid = semget(paKey, paNsems, paSemFlg)); for (int i = 0; i < paNsems; ++i) { semctl(semid, i, SETVAL, 0); } } void kic() { printf("\naaaaaaaaaaaaaa\n"); } int main() { key_t key = 1234; int semflg = IPC_CREAT | 0666; int nsems = 15; int semid; fprintf(stderr, "%d=", sops); createSem(IPC_PRIVATE, semflg, nsems); if (semid == -1) { perror("semget: semget failed"); return 1; } else fprintf(stderr, "semget: semget sucess: semid = %d, parrent pid %d\n", semid, getpid()); int PROCESS_ID = 0; pid_t PID; for (int i = 1; i < nsems; i++) { PID = fork(); if(PID == 0) { PROCESS_ID = i; break; } } if(PID == -1) { printf("\nPID ERROR"); } if(PID != 0) //parrent { printf("\n\nparrent with ID %d", PROCESS_ID); signal_sem(PROCESS_ID+1, PROCESS_ID); wait_sem(PROCESS_ID, PROCESS_ID); printf ("uid=%d euid=%d\n", (int) getuid (), (int) geteuid ()); printf("\nEND %d\n", getpid()); int s; wait(&s); if((semctl(semid, 0, IPC_RMID, 0))==-1) { int a = errno; printf("\nERROR IPC_RMID %d\n", a); } } if(PID == 0)//child { if(wait_sem(PROCESS_ID, PROCESS_ID) == 0){ printf("\nI am child with ID %d", PROCESS_ID); int ID_NEXT_PROCESS = 1+PROCESS_ID; if(ID_NEXT_PROCESS == nsems) ID_NEXT_PROCESS = 0; signal_sem(ID_NEXT_PROCESS, PROCESS_ID); return 0; } } return 0; } #包括 #包括 #包括 #包括 #包括 #包括 #包括 联合塞蒙{ int-val; 结构semid_ds*buf; ushort*阵列; }; 结构sembuf标准操作程序[1]; int-semid; int wait_sem(int index,int pid){ fprintf(stderr,“\n------进程%d对信号量%d执行操作等待(-1)”,pid,索引); sops[0]。sem_num=索引; 标准操作程序[0].sem_op=-1; 标准操作程序[0].sem_flg=0; 如果(semop(semid,sops,1)

IPC#RMID在使用C++; 我正在努力解决C++中的学校项目。我必须创建15个进程,它们必须按顺序运行,这意味着进程按顺序运行01 2 3 4 5 6 7 8 9 10 11 12 14 0。它可以工作,但是当我试图从内存中删除信号量时,我从semctl中得到了错误。最后,我使用了“semctl(semid,0,IPC_RMID,0)”,但我得到了错误22,这意味着EINVAL,但它没有意义,我尝试从parrent进程中删除信号量,所以我应该有权限这样做 #include <stdio.h> #include <unistd.h> #include <sys/types.h> #include <sys/ipc.h> #include <sys/sem.h> #include <errno.h> #include <sys/wait.h> union semun { int val; struct semid_ds *buf; ushort *array; }; struct sembuf sops[1]; int semid; int wait_sem(int index, int pid){ fprintf(stderr, "\n------- Proces %d do operation wait (-1) on semaphore %d\n",pid, index); sops[0].sem_num = index; sops[0].sem_op = -1; sops[0].sem_flg = 0 ; if (semop(semid, sops, 1)<0){ perror("semop fail wait"); return 1; } else return 0; } int signal_sem(int index, int pid){ fprintf(stderr, "\n++++++ Proces %d vykonava operaciu signal (1) na semafore %d\n",pid,index); sops[0].sem_num = index; sops[0].sem_op = 1; sops[0].sem_flg = 0; if (semop(semid, sops, 1)<0){ perror("semop fail signal"); return 1; } else return 0; } void createSem(key_t paKey, int paSemFlg, int paNsems) { printf ("uid=%d euid=%d\n", (int) getuid (), (int) geteuid ()); (semid = semget(paKey, paNsems, paSemFlg)); for (int i = 0; i < paNsems; ++i) { semctl(semid, i, SETVAL, 0); } } void kic() { printf("\naaaaaaaaaaaaaa\n"); } int main() { key_t key = 1234; int semflg = IPC_CREAT | 0666; int nsems = 15; int semid; fprintf(stderr, "%d=", sops); createSem(IPC_PRIVATE, semflg, nsems); if (semid == -1) { perror("semget: semget failed"); return 1; } else fprintf(stderr, "semget: semget sucess: semid = %d, parrent pid %d\n", semid, getpid()); int PROCESS_ID = 0; pid_t PID; for (int i = 1; i < nsems; i++) { PID = fork(); if(PID == 0) { PROCESS_ID = i; break; } } if(PID == -1) { printf("\nPID ERROR"); } if(PID != 0) //parrent { printf("\n\nparrent with ID %d", PROCESS_ID); signal_sem(PROCESS_ID+1, PROCESS_ID); wait_sem(PROCESS_ID, PROCESS_ID); printf ("uid=%d euid=%d\n", (int) getuid (), (int) geteuid ()); printf("\nEND %d\n", getpid()); int s; wait(&s); if((semctl(semid, 0, IPC_RMID, 0))==-1) { int a = errno; printf("\nERROR IPC_RMID %d\n", a); } } if(PID == 0)//child { if(wait_sem(PROCESS_ID, PROCESS_ID) == 0){ printf("\nI am child with ID %d", PROCESS_ID); int ID_NEXT_PROCESS = 1+PROCESS_ID; if(ID_NEXT_PROCESS == nsems) ID_NEXT_PROCESS = 0; signal_sem(ID_NEXT_PROCESS, PROCESS_ID); return 0; } } return 0; } #包括 #包括 #包括 #包括 #包括 #包括 #包括 联合塞蒙{ int-val; 结构semid_ds*buf; ushort*阵列; }; 结构sembuf标准操作程序[1]; int-semid; int wait_sem(int index,int pid){ fprintf(stderr,“\n------进程%d对信号量%d执行操作等待(-1)”,pid,索引); sops[0]。sem_num=索引; 标准操作程序[0].sem_op=-1; 标准操作程序[0].sem_flg=0; 如果(semop(semid,sops,1),c++,linux,ipc,semaphore,C++,Linux,Ipc,Semaphore,您有两个semids。一个在全局范围内,另一个在本地到main(哪个阴影是全局的,您应该看到一个警告) CurATESEM只知道全局代码。 SSECTL/直接由主< /C> >,并通过本地的一个,这是垃圾。看起来更像C而不是C++,但是正如您明确地询问C++:不要为C++问题添加C标记。IC命令。你不能有。对不起我的错误,我的意思是:),我的所有代码都在C++中运行,但这是我的代码的例子,不是我所有的代码:现在我的代码的其余部分并不重要。

您有两个
semid
s。一个在全局范围内,另一个在本地到
main
(哪个阴影是全局的,您应该看到一个警告)<代码> CurATESEM只知道全局代码。<代码> SSECTL/<代码>直接由<代码>主< /C> >,并通过本地的一个,这是垃圾。

看起来更像C而不是C++,但是正如您明确地询问C++:不要为C++问题添加C标记。IC命令。你不能有。对不起我的错误,我的意思是:),我的所有代码都在C++中运行,但这是我的代码的例子,不是我所有的代码:现在我的代码的其余部分并不重要。