我正在尝试创建一个创建两个儿子(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,&#34; a&#34;)
然后在儿子中我做了strcat(segptr,&#34; test1&#34;)而在r_pid2中我做了strcat(segptr,&#34; test2&#34;)
父亲将打印test1test2,反之亦然。
答案 0 :(得分:0)
无法保证第一个孩子在第二个孩子之前跑步。那么,
segptr+=2;
…
strcat(segptr,"14");
可以在
之前执行 strcpy(segptr,"12");
导致第一个数字“14”被终止空字符“12”覆盖。
为了使其有效,我需要做些哪些修改?
确保写入不重叠,例如: G。通过改变
strcpy(segptr,"12");
到
strncpy(segptr, "12", 2);