我正在尝试创建一个小程序,该程序创建两个儿子(proccess),每个儿子生成随机数。父亲等待儿子们总结结果。
问题:要使其正常工作,我需要做哪些修改?
这是我到目前为止所做的。
#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
#define SEGSIZE 100
void main()
{
key_t key;
int shmid;
char *segptr;
int status=0;
int r_pid=1;
int r_pid2=1;
key = ftok(".", 'T');
if((shmid = shmget(key, SEGSIZE,IPC_CREAT|IPC_EXCL|0666))== -1)
{
printf("Shared memory segment exists - opening as client\n");
if((shmid = shmget(key, SEGSIZE, 0)) == -1)
{
perror(" bad shmget");
exit(1);
}
}
else
{
printf("Creating new shared memory segment\n");
}
if((segptr = shmat(shmid, 0, 0)) == NULL)
{
perror("shmat");
exit(1);
}
r_pid=fork();
if(r_pid!=0)
r_pid2=fork();
if(r_pid<0 || r_pid2<0 )
{
printf("No child created");
exit(1);
}
if(r_pid==0 )
{
printf("The child process with PID number : %d"" (his parent PID is %d) writes a text to the shared"" memory\n",getpid(),getppid());
strcpy(segptr,"12");
}
else if(r_pid2==0)
{
segptr+=2;
printf("The child process with PID number : %d" " (his parent PID is %d) writes a text to the shared"" memory\n",getpid(),getppid());
strcat(segptr,"14");
}
else
{
r_pid = wait(&status);
r_pid2 = wait(&status);
printf(" The following text is received by the ""parent process with PID number pid: %d pid2 : %d text: %s\n",r_pid,r_pid2,segptr);
}
shmctl(shmid, IPC_RMID, 0);
}
欢迎提出建议!谢谢。
编辑
这是一些更新:
如果我使用无用字符初始化segptr,例如:strpy(segptr,“ a”)
然后在儿子中我做strcat(segptr,“ test1”),在r_pid2中我做strcat(segptr,“ test2”)
父亲将打印test1test2,反之亦然。
最佳答案
不能保证第一个孩子在第二个孩子之前跑。所以
segptr+=2;
…
strcat(segptr,"14");
可能在执行之前
strcpy(segptr,"12");
使第一个数字“ 14”被终止的空字符“ 12”覆盖。
我需要做哪些修改才能使其正常工作?
确保写不重叠,例如。 G。通过改变
strcpy(segptr,"12");
至
strncpy(segptr, "12", 2);