0
我有下面的代碼應該創建一個分叉進程來執行Collatz猜想(基於傳遞的值),並將整數推入共享內存。當子進程完成時,父進程應該打印出這些值。出於某種原因,我的代碼有時可以使用,但不是其他的。從調試語句中,我可以看到值被推入,但有時打印出值的代碼似乎不會執行(僅打印一些空白行)。我在一個虛擬框中使用Debian Linux。帶有分叉子的共享內存
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/shm.h>
#include <sys/mman.h>
int main()
{
const int SIZE = 2048;
const char *name = "SHARON";
int shm_fd;
void *ptr;
int count = 1;
/* Setup shared memory */
shm_fd = shm_open(name, O_CREAT | O_RDWR, 0666);
ftruncate(shm_fd, SIZE);
ptr = mmap(0, SIZE, PROT_WRITE, MAP_SHARED, shm_fd, 0);
/* Get the starting value */
int value;
printf("Enter a positive integer value: ");
scanf("%d", &value);
printf("\n");
if (value < 0)
{
printf("ERROR: Integer value must be positive!");
return 1;
}
/* Fork child process */
pid_t pid;
pid = fork();
fork();
if (pid < 0)
{
fprintf(stderr, "FORK FAILED\n");
return 1;
}
else if (pid > 0) /*parent process*/
{
wait(); /*wait for child to send */
while (atoi((char *)ptr) != 0) /*0 is terminate value*/
{
printf("%s", (char *)ptr);
ptr += sizeof(int);
if (atoi((char *)ptr) != 0)
printf(", ");
}
printf("\n");
shm_unlink(name);
}
else if (pid == 0) /* child process */
{
sprintf(ptr, "%d", value);
ptr += sizeof(value);
while (value != 1)
{
if (value % 2 == 0)
value /= 2;
else
value = value * 3 + 1;
sprintf(ptr, "%d", value);
ptr += sizeof(value);
}
sprintf(ptr,"0"); //push a "terminate" value
ptr += sizeof(value);
}
return 0;
}
任何提示我做錯了什麼?
也許是因爲你連續兩次調用'fork'? – kaylum
爲什麼要將字符串零置入共享內存中,然後推進整數零的大小? –
OMG,我怎麼沒有看到?這看起來就是這個問題!像David指出的那樣,我也修正了推動0。多謝你們! – DaWood